Importuj csv: usuń nazwę pliku z nazw kolumn w pierwszym wierszu

Dec 01 2020

Używam Pythona 3.5. Mam kilka plików csv:

Pliki csv są nazywane zgodnie z ustaloną strukturą. Mają stały prefiks (zawsze taki sam) oraz zmienną część nazwy pliku:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

Moje oryginalne pliki csv wyglądają tak:

filename1-Streetname filename1-ZIPCODE
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
TEXT TEXT
Name1 2012932
Name2 3023923

Manipuluję tymi plikami za pomocą następującego kodu (czytam pliki csv z folderu źródłowego i zapisuję je w folderze docelowym. Pomijam niektóre wiersze, ponieważ nie chcę uwzględniać tych informacji):

Odcięłam wiersze TEXT, ponieważ ich nie potrzebuję:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            writer.writerows(rows)

(ten kod działa) daje

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

Pierwszy wiersz zawiera nagłówek. W nazwach nagłówków zawsze znajduje się nazwa pliku (jednak bez prefiksu 099_2019_01_01_) plus „-”. Brak pliku kończącego się .csv. Chcę usunąć to „nazwa_pliku-” dla każdego pliku csv.

Podstawową częścią jest teraz pobranie pierwszego wiersza i tylko dla tego wiersza wykonanie zamiany. Muszę odciąć prefiks i plik .csv, a następnie wykonać ogólne zastąpienie. Pierwsza zamiana może wyglądać mniej więcej tak:

  1. Albo mógłbym zacząć od funkcji odcięcia pierwszych n znaków, ponieważ długość jest stała lub
  2. Zgodnie z tym rozwiązaniem wystarczy użyćstring.removeprefix('099_2019_01_01_')

Ponieważ mam Pythona 3.5, nie mogę użyć removeprefix, więc staram się go po prostu zastąpić.

string.replace ("099_2019_01_01_", "")

Następnie muszę usunąć plik .csv, co jest łatwe:

string.replace(".csv","")

Składam to razem i otrzymuję (string.replace("099_2019_01_01_","")).replace(".csv",""). (Dodatkowo na końcu należy również usunąć „-”, patrz poniższy kod). Nie jestem pewien, czy to zadziała.

Moim głównym problemem jest teraz ten kod importu csv, że nie wiem, jak mogę manipulować tylko pierwszym wierszem podczas odczytu / zapisu csv. Więc chcę to zastąpić tylko w pierwszym rzędzie. Próbowałem czegoś takiego:

import csv
    
skiprows = (1,2,3,4,5,6)
for file in os.listdir(sourcefolder):
    with open(os.path.join(sourcefolder,file)) as fp_in:
        reader = csv.reader(fp_in, delimiter=';')
        rows = [row for i, row in enumerate(reader) if i not in skiprows]
        with open(os.path.join(destinationfolder,file), 'w', newline='') as fp_out:
            writer = csv.writer(fp_out)
            rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")
            writer.writerows(rows)

Daje to błąd, ponieważ pomysł z wierszami [0] nie działa. Jak mogę to zrobić?

(Nie jestem pewien, czy powinienem spróbować uwzględnić to zastąpienie w kodzie, czy też umieścić go w drugim kodzie, który jest uruchamiany po pierwszym kodzie. Jednak zakładam, że ponownie czytałbym i zapisywał pliki csv. Więc myślę, że tak byłoby najbardziej wydajne, aby zaimplementować go w tym kodzie. W przeciwnym razie muszę ponownie otworzyć, zmienić i zapisać każdy plik. Jeśli jednak nie jest możliwe uwzględnienie go w tym kodzie, byłbym również w porządku z kodem, który działa samodzielnie i po prostu zastępuje, zakładając, że plik csv ma ​​wiersze 0 jako nagłówek, a następnie przychodzą dane.)

Pamiętaj, że chcę iść tą drogą z csv i nie używać pand.

EDYCJA: Na koniec pliki csv powinny wyglądać tak:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

Odpowiedzi

1 IoaTzimas Dec 01 2020 at 13:58

Spróbuj, zastępując to:

rows[0].replace((file.replace("099_2019_01_01_","")).replace(".csv","")+"-","")

W swoim kodzie:

x=file.replace('099_2019_01_01_','').replace('.csv', '')
rows[0]=[i.replace(x+'-', '') for i in rows[0]]