Seite 1 von 1

Telefonnummernkonvertierung in .csv Datei

Verfasst: Freitag 9. August 2024, 17:34
von No_Original_54
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!

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Freitag 9. August 2024, 17:59
von No_Original_54
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!

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Samstag 10. August 2024, 08:30
von Sirius3
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)

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Samstag 10. August 2024, 16:34
von __blackjack__
@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()

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Freitag 16. August 2024, 22:34
von imonbln
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

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Mittwoch 21. August 2024, 17:45
von No_Original_54
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!

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Mittwoch 21. August 2024, 19:20
von __blackjack__
@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.

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Donnerstag 22. August 2024, 10:20
von DeaD_EyE
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.

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Donnerstag 22. August 2024, 13:13
von Sirius3
@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.

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Donnerstag 22. August 2024, 13:15
von __blackjack__
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.

Re: Telefonnummernkonvertierung in .csv Datei

Verfasst: Donnerstag 22. August 2024, 14:05
von DeaD_EyE
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/