Python парсинг CSV-файла - заменить запятые на двоеточия

Я подозреваю, что это обычная проблема, но я не могу найти ответ. Я пытаюсь удалить все запятые из файла CSV и заменить их двоеточиями. Я бы обычно использовал sed или vi для этого, но мне нужно использовать чисто Python-реализацию. Вот что я придумала до сих пор:

import csv

with open("temp.csv", mode="rU") as infile:
    reader = csv.reader(infile, dialect="excel")    
    with open("temp2.txt", mode="w") as outfile:
        writer = csv.writer(outfile)
        for rows in reader:
            for parsed_item in rows:
                parsed_item = rows.replace(',', ':') # I can't do this with a list!
                writer.writerow(parsed_item)

Может кто-нибудь помочь мне с этим? Заранее спасибо за помощь.

4 ответа

Решение

Ответ проще, чем вы думаете. Вам просто нужно установить разделитель для csv.writer:

import csv

row = #your data

with open("temp.csv", mode="rU") as infile:
    reader = csv.reader(infile, dialect="excel")    
    with open("temp2.txt", mode="w") as outfile:
        writer = csv.writer(outfile, delimiter=':')
        writer.writerows(rows)

Вы пытаетесь заменить линию , с : не собирался ничего делать, потому что строка уже была обработана csv.reader,

Если вы хотите прочитать csv с разделителем-запятой и записать его в другой файл с разделителями-запятыми. Я думаю, что более простой способ будет:

reader = csv.reader(open("input.csv", "rU"), delimiter=',')
writer = csv.writer(open("output.csv", 'w'), delimiter=';')
writer.writerows(reader)

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

Также, если вы хотите переписать в том же файле, проверьте этот ответ stackru.

Я построю свой ответ на ответе @Sylhare. В python3 режим 'U' устарел. Итак, у меня сработало следующее решение:

import csv

reader = csv.reader(open("input.csv", newline=None), delimiter=',')
writer = csv.writer(open("output.csv", 'w'), delimiter=':')
writer.writerows(reader)

Я пишу файлы csv из необработанных данных JSON и заметил, что DictWriterмодуль также поддерживает различные разделители. Пример:

with open('file_1.csv', 'w', encoding="utf-8-sig", newline = '') as myfile:
    wr = csv.DictWriter(myfile, fieldnames = table_fields, delimiter=';')
    wr.writeheader()
    wr.writerows(# my data #)

Предполагая, что CSV разделен запятыми, и вы хотите заменить запятые в каждой записи, я думаю, что проблема заменяет неправильный элемент:

for rows in reader:
    for parsed_item in rows:
        parsed_item = parsed_item.replace(',', ':') # Change rows to parsed_item
        writer.writerow(parsed_item)

Если вы просто заменяете запятые двоеточиями, вам вообще не нужно использовать csv-парсер.

with open("file.csv", 'r') as f:
    with open("temp.csv", 'w') as t:
        for lines in f:
            new_line = line.replace(",",":")
            t.write(new_line)

Единственное предостережение в том, что в другом месте файла CSV не должно быть запятых.

Другие вопросы по тегам