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/