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?
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.
Vet du att din python-fil är i Unicode?
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".
Använder du Python 2 eller3? Mycket blev enklare i Python 3, men det är fortfarande inte alltid lätt.