Telefonnummernkonvertierung in .csv Datei

Du hast eine Idee für ein Projekt?
Antworten
No_Original_54
User
Beiträge: 3
Registriert: Freitag 9. August 2024, 17:23

Hallo zusammen,

ich bin komplett neu mit python unterwegs und möchte gerne eine .csv Datei bearbeiten. In Zeile 7 und 8 stehen dort Telefonnummern beginnend mit 0. Diese sollen in der Ausgabedatei mit +49 beginnen.

Das habe ich bisher zu Stande gebracht:

Code: Alles auswählen

import csv

with open(r'C:\Users\maxwefers\KampagnenTestExport.csv', 'r') as csv_datei:
    reader = csv.reader(csv_datei, delimiter=';')
    
    for zeile in reader:
        print(f'Vorname: {zeile[7]} - Nachname: {zeile[8]}')
     
#def convert_phone_number(phone_number):
#    if phone_number.startswith("0"):
#        return "+49" + phone_number[1:]
#    return phone_number

Ich bin sehr dankbar für Hilfe!
No_Original_54
User
Beiträge: 3
Registriert: Freitag 9. August 2024, 17:23

Hi,

bin inzwischen ein gutes Stück weitergekommen:

Code: Alles auswählen

import csv

input_file = r'C:\Users\XXXX\TestExport.csv'
output_file = r'C:\Users\XXXX\geänderte_datei.csv'

def convert_phone_number(phone_number):
    if phone_number.startswith("0"):
        return "+49" + phone_number[1:]
    return phone_number

with open(input_file, mode='r', newline='') as infile, \
     open(output_file, mode='w', newline='') as outfile:
    
    reader = csv.reader(infile)
    writer = csv.writer(outfile)
    
    for row in reader:
        if len(row) >= 9: 
            row[8] = convert_phone_number(row[8]) 
        writer.writerow(row)

print(f"Telefonnummern wurden erfolgreich geändert und in '{output_file}' gespeichert.")

Jedoch werden die Nummern nicht geändert. :?

Beste Grüße!
Sirius3
User
Beiträge: 17992
Registriert: Sonntag 21. Oktober 2012, 17:20

Erster Schritt wäre, zu schauen, ob die Variablen wirklich die Werte enthalten, die Du erwartest:

Code: Alles auswählen

    for row in reader:
        print("vorher", row)
        if len(row) >= 9: 
            row[8] = convert_phone_number(row[8])
        print("nachher", row)
        writer.writerow(row)
Benutzeravatar
__blackjack__
User
Beiträge: 13424
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@No_Original_54: Berücksichtigst Du das die Indizes bei 0 anfangen und nicht bei 1? Also ``row[8]`` ist die 9. Spalte, nicht die 8. Spalte. Die Spalten sind auch durch "," getrennt und nicht beispielsweise durch ";"?

Anmerkungen zum Quelltext: Das Hauptprogramm sollte auch in einer Funktion stehen. Die heisst üblichwerweise `main()`.

Konstanten werden per Konvention KOMPLETT_GROSS geschrieben.

Bei etwas was `file` heisst, erwartet der Leser ein Dateiobjekt und keine Zeichenkette. `input_file` und `output_file` sind also besser `input_filename` und `output_filename`. `infile` und `outfile` wären bessere Kandidaten für `input_file` und `output_file`.

Beim öffnen von Textdateien sollte man immer explizit die Kodierung angeben, sonst wird ”geraten” und auf verschiedenen Systemen was unterschiedliches genommen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv

INPUT_FILENAME = R"C:\Users\XXXX\TestExport.csv"
OUTPUT_FILENAME = R"C:\Users\XXXX\geänderte_datei.csv"


def convert_phone_number(text):
    return "+49" + text[1:] if text.startswith("0") else text


def main():
    with (
        open(INPUT_FILENAME, "r", newline="", encoding="ascii") as input_file,
        open(
            OUTPUT_FILENAME, "w", newline="", encoding="ascii"
        ) as output_file,
    ):
        reader = csv.reader(input_file)
        writer = csv.writer(output_file)
        for row in reader:
            if len(row) >= 9:
                row[8] = convert_phone_number(row[8])
            writer.writerow(row)

    print(
        f"Telefonnummern wurden erfolgreich geändert und in '{OUTPUT_FILENAME}'"
        f" gespeichert."
    )


if __name__ == "__main__":
    main()

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
imonbln
User
Beiträge: 154
Registriert: Freitag 3. Dezember 2021, 17:07

Die Funktion ist IHMO inkomplett. Steht zwar nicht in der Beschreibung, aber wenn schon eine internationale Nummer in der CSV steht, kommt eine ungültige Nummer raus.

Code: Alles auswählen

def convert_phone_number(text):
    return "+49" + text[1:] if text.startswith("0") else text

Siehe folgendes Beispiel:

Code: Alles auswählen

In [1]: def convert_phone_number(text):
   ...:     return "+49" + text[1:] if text.startswith("0") else text
   ...: 

In [2]: convert_phone_number("0049123456")
Out[2]: '+49049123456'

Ich empfehle die Funktion daher wie folgt erweitern:

Code: Alles auswählen

def convert_phone_number(text):
    if text.startswith("00"):
        return "+" + text[2:]
    return "+49" + text[1:] if text.startswith("0") else text
No_Original_54
User
Beiträge: 3
Registriert: Freitag 9. August 2024, 17:23

Hallo,

vielen Dank schonmal! Die Hilfe hier ist echt super! Ich hatte tatsächlich ein Problem mit ; und , - dachte eigentlich, dass mir das nicht unterkommt. Naja!

Ich würde jetzt noch gerne mit

Code: Alles auswählen

if len(row) >= 9 and row[8].strip(): 
            writer.writerow(row)
die Zeilen nicht in die Ausgabe schreiben, wenn die 9. Spalte in der csv Datei (also die 8.) leer ist.

Wie kann ich das als z.B. 'delete_row' integrieren?

Dann habe ich auch vorher schon versucht ein festes Encoding festzulegen. Wenn ich

Code: Alles auswählen

with open(INPUT_FILENAME, mode='r', newline='', encoding="ascii") as input_file, \
 open(OUTPUT_FILENAME, mode='w', newline='', encoding="ascii") as output_file:
 
angebe bekomme ich folgenden Fehler:

return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xdf in position 139: ordinal not in range(128)

Ohne Angabe zum Encoding läuft es durch.

Vielen Dank im Voraus!
Benutzeravatar
__blackjack__
User
Beiträge: 13424
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@No_Original_54: Deswegen habe ich ja ASCII genommen, weil ich sehr stark vermutet habe, dass es *wichtig* ist sich um die Kodierung zu kümmern, aber natürlich nicht weiss welche Kodierung die Datei hat. Es mag ohne Angabe durchlaufen, aber das ist halt nicht garantiert, dass das funktioniert. Man muss da die tatsächliche Kodierung der Datei angeben. Sonst ”rät” Python die Systemeinstellung. Die kann zur Datei passen. Oder eben auch nicht.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
DeaD_EyE
User
Beiträge: 1081
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Ich würde UTF8 verwenden und bei Problemen mit Umlauten latin1, was ein Alias für ISO 8859-1 ist. Dann kann man noch cp1250 bzw. cp1252 probieren.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Sirius3
User
Beiträge: 17992
Registriert: Sonntag 21. Oktober 2012, 17:20

@dead_eye: offensichtlich ist ja die Eingangsdatei nicht UTF-8 kodiert. Die Empfehlungen wäre also erst die Dateien zu konvertieren und dann nur noch UTF-8 zu verwenden. Welches Encoding aber zur Zeit verwendet wird, kann man nur raten.
Benutzeravatar
__blackjack__
User
Beiträge: 13424
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

In den genannten nicht-UTF-Fällen wäre es ein „ß“.

@No_Original_54: Dazu müsste die Bedingung umgedreht formuliert werden. Also nicht schauen ob nichts drin ist, sondern ob was drin steht, wenn dann geschrieben werden soll.

Code: Alles auswählen

    **** COMMODORE 64 BASIC V2 ****
 64K RAM SYSTEM  38911 BASIC BYTES FREE
   CYBERPUNX RETRO REPLAY 64KB - 3.8P
READY.
█
Benutzeravatar
DeaD_EyE
User
Beiträge: 1081
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Sirius3 hat geschrieben: Donnerstag 22. August 2024, 13:13 @dead_eye: offensichtlich ist ja die Eingangsdatei nicht UTF-8 kodiert. Die Empfehlungen wäre also erst die Dateien zu konvertieren und dann nur noch UTF-8 zu verwenden. Welches Encoding aber zur Zeit verwendet wird, kann man nur raten.
Ja, es gibt sogar ein Tool für Python, die das korrigieren können: https://pypi.org/project/ftfy/
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten