Чтение CSV-файла автоматического делимера - PullRequest
0 голосов
/ 29 мая 2018

У меня есть небольшой скрипт, который читает канал '|'CSV-файл с разделителями, а затем записывает его в другой файл с разделителями-запятыми.Работает нормально.Код, входной файл и выходной файл ниже:

import csv


ifile = "d:\\python\\project\\cars-original.csv"
ofile = "d:\\python\\project\\cars.csv"

with open(ifile, 'r') as f:
    reader = csv.reader(f, delimiter='|')
    with open(ofile, 'w', newline='') as of:
        writer = csv.writer(of, delimiter=',')
        for row in reader:
            writer.writerow(row)

Reading|Make|Model|Type|Value Reading 0|Toyota|Previa|distance|19.83942 Reading 1|Dodge|Intrepid|distance|31.28257 Reading,Make,Model,Type,Value Reading 0,Toyota,Previa,distance,19.83942 Reading 1,Dodge,Intrepid,distance,31.28257

Теперь я хочу изменить скрипт, чтобы он мог автоматически читать тип разделителя.

Я нашел несколько примеров в Интернете, но когда я запускаю свой, я получаю пустой файл для вывода.Нет ошибок, просто пусто.Не уверен, что я делаю неправильно.

Мой измененный (неработающий) скрипт:

import csv


ifile = "d:\\python\\projects\\cars-original.csv"
ofile = "d:\\python\\projects\\cars.csv"


with open(ifile, 'r') as f:
    reader = csv.reader(f)
    dialect = csv.Sniffer().sniff(f.read(1024), delimiters=',|')
    with open(ofile, 'w', newline='') as of:
        writer = csv.writer(of, dialect)
        for row in reader:
            writer.writerow(row)

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Это работает:

import csv


ifile = "d:\\python\\project\\cars-original.csv"
ofile = "d:\\python\\project\\cars.csv"


with open(ifile, 'r') as f:
    dialect = csv.Sniffer().sniff(f.readline(), [',', '|'])
    f.seek(0)
    reader = csv.reader(f, dialect)
    with open(ofile, 'w', newline='') as of:
        writer = csv.writer(of, delimiter=',')
        for row in reader:
            writer.writerow(row)
0 голосов
/ 29 мая 2018

В примере из документации Python (https://docs.python.org/3.6/library/csv.html) указатель файла перемещается в начало файла сразу после обнаружения диалекта.

with open('example.csv', newline='') as csvfile:
    dialect = csv.Sniffer().sniff(csvfile.read(1024))
    csvfile.seek(0)
    reader = csv.reader(csvfile, dialect)
...