Импортировать csv: удалить имя файла из имен столбцов в первой строке

Dec 01 2020

Я использую Python 3.5. У меня есть несколько файлов csv:

Файлы CSV именуются в соответствии с фиксированной структурой. У них есть фиксированный префикс (всегда один и тот же) плюс различная часть имени файла:

099_2019_01_01_filename1.csv
099_2019_01_01_filename2.csv

Мои исходные файлы csv выглядят так:

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

Я управляю этими файлами, используя следующий код (я читаю файлы csv из исходной папки и записываю их в папку назначения. Я пропускаю определенные строки, так как не хочу включать эту информацию):

Я обрезаю ТЕКСТОВЫЕ строки, так как они мне не нужны:

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)

(этот код работает) дает

filename1-Streetname filename1-ZIPCODE
Street1 2012932
Street2 3023923

filename2-Name filename2-Phone
Name1 2012932
Name2 3023923

Первая строка содержит заголовок. В именах заголовков всегда присутствует имя файла (но без префикса 099_2019_01_01_) плюс «-». Имя файла с расширением .csv отсутствует. Я хочу удалить это "имя-файла-" для каждого файла csv.

Основная часть теперь состоит в том, чтобы получить первую строку и только для этой строки выполнить замену. Мне нужно отрезать префикс и .csv, а затем выполнить общую замену. Первая замена может быть примерно такой:

  1. Либо я мог бы начать с функции, чтобы отрезать первые n знаков, поскольку длина фиксирована, либо
  2. В соответствии с этим решением просто используйтеstring.removeprefix('099_2019_01_01_')

Поскольку у меня Python 3.5, я не могу использовать removeprefix, поэтому стараюсь просто заменить его.

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

Затем мне нужно удалить .csv, что очень просто:

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

Я складываю это и получаю (string.replace("099_2019_01_01_","")).replace(".csv",""). (Плюс в конце "-" тоже нужно удалить, см. Код ниже). Я не уверен, работает ли это.

Моя основная проблема теперь связана с этим кодом импорта csv, и я не знаю, как я могу управлять только первой строкой при чтении / записи csv. Поэтому я хочу заменить это только в первой строке. Я пробовал примерно так:

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)

Это дает ошибку, поскольку идея с rows [0] не работает. Как я могу это сделать?

(Я не уверен, стоит ли мне попытаться включить эту замену в код или поместить ее во второй код, который запускается после первого кода. Однако, я полагаю, тогда я бы снова прочитал и записал файлы csv. Так что я думаю, что это будет быть наиболее эффективным, чтобы внедрить его в этот код. В противном случае мне нужно будет снова открывать, изменять и сохранять каждый файл. Однако, если невозможно включить его в этот код, я бы тоже был в порядке с кодом, который работает автономно и просто выполняет замену, предполагая, что файл csv имеет строки 0 в качестве заголовка, а затем приходят данные.)

Обратите внимание, что я хочу пойти по этому пути с CSV и не использовать pandas.

РЕДАКТИРОВАТЬ: В конце файлы csv должны выглядеть так:

Streetname ZIPCode
Street1 9999
Street2 9848

Name Phone
Name1 23421
Name2 23232

Ответы

1 IoaTzimas Dec 01 2020 at 13:58

Попробуйте заменить это:

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

Этим в вашем коде:

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