4 svar
71 visningar
elitor behöver inte mer hjälp
elitor 8
Postad: 4 okt 12:26

Python - Problem med kodtecken

Hej!

Jag har ett problem i min kod, jag håller på med ett datalager och en av funktionerna är en sökfunktion.  Jag har också en testfil som gör enhetstester(unittest) och i den söks det efter "okänt" likt:

 res = data.search(self.loaded_data,
           sort_by="end_date",
           search='okänt',
           search_fields=['project_id','project_name','course_name'])

Testet fungerar om jag ändrar det till "OKÄNT" istället men inte med det som ska vara i testfilen, så jag antar att det är på grund av teckenkodningen som det blir fel men har försökt använda mig av unicodedata.normalize för att lösa det men det fungerar fortfarande inte.

Här är min search()-funktion:

def search(db, sort_by='start_date', sort_order='desc', techniques=None, search=None, search_fields=None):
    results = db.copy()  # Kopiera databasen för filtrering
    print(f"Initial project count: {len(results)}")  # Antal initiala projekt

    # Hantera tekniker
    if techniques:
        results = [project for project in results if set(techniques).issubset(set(project.get('techniques_used', [])))]
        print(f"Filtered by techniques ({techniques}): {len(results)} projects remaining")  # Antal kvarvarande projekt efter teknikfiltrering

    # Hantera sökning
    if search:
        # Normalisera söksträngen
        search = unicodedata.normalize('NFC', search)  
        print(f"Searched for: '{search}' in fields: {search_fields}")  # Skriv ut söktermen

        if search_fields is None:
            search_fields = ['project_id', 'project_name', 'course_name', 'short_description', 'long_description']

        # Filtrera projekten baserat på sökning
        results = [
            project for project in results
            if any(
                search in unicodedata.normalize('NFC', str(project.get(field, ''))) for field in search_fields
            )
        ]
        
        print(f"Filtered results: {len(results)}")  # Skriv ut antal filtrerade resultat

    # Sortera resultaten
    if sort_by in ['start_date', 'end_date', 'group_size', 'project_id']:
        results = sorted(results, key=lambda x: x[sort_by], reverse=(sort_order == 'desc'))
        print(f"Sorted by {sort_by} in {'desc' if sort_order == 'desc' else 'asc'} order: {len(results)} projects remaining")  # Antal kvarvarande projekt efter sortering
    
    return results

Ursäkta om den är lite rörig, men har någon tips?


farfarMats 1187
Postad: 4 okt 16:41

Kanske kan det vara förutsättningarna som är fel, alltså att själva utskriften av innehållet i databasen som har kodats om till de två tecknen.

Det bekymrar mig också att du får träff med versaler när det 'ska vara' gemena.

Laguna Online 30429
Postad: 4 okt 18:12

Vet du att din python-fil är i Unicode?

sictransit 1070 – Livehjälpare
Postad: 4 okt 18:15 Redigerad: 4 okt 18:19

Två frågor (varav Lagunas är den ena, mycket relevant!):

  • Vad är din källkod i för teckenkodning, UTF-8?
  • Vad är ditt data i för teckenkodning?

Det här är ett klassiskt problem. Det är inte svårt, när man förstår och har koll. Dock är det väldigt vanligt att man inte har det. Seniora kollegor på mitt jobb flackar med blicken. I mitt fall råkar det vara ett nördigt specialintresse, precis som representation av datum och tid. 

Att du har "okänt" i koden gör mig lite bekymrad. Kanske råkar det fungera, men i så fall på grund av "dubbelfel". 

Laguna Online 30429
Postad: 4 okt 18:24

Använder du Python 2 eller3? Mycket blev enklare i Python 3, men det är fortfarande inte alltid lätt.

Svara
Close