Замена разделителя в файлах CSV на Python - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть папка с несколькими файлами CSV.Все эти файлы содержат прямоугольник с двойным вертикальным и горизонтальным разделителями.Я пытаюсь импортировать все эти файлы в Python, изменить этот разделитель на канал, а затем сохранить новые файлы в другом месте.Код, который у меня есть, работает без ошибок, но на самом деле ничего не делает.Любые предложения?

import os
import pandas as pd

directory = 'Y:/Data'
dirlist = os.listdir(directory)
file_dict = {}
x = 0

for filename in dirlist:
    if filename.endswith('.csv'):
        file_dict[x] = pd.read_csv(filename)
        column = file_dict[x].columns[0]
        file_dict[x] = file_dict[x][column].str.replace('╬', '|')
        file_dict[x].to_csv("python/file{}.csv".format(x))
        x += 1

Вот изображение примера данных:

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

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

import csv
with open('myfile.csv', newline='') as infile, open('outfile.csv', 'w', newline='') as outfile:
    reader = csv.reader(infile, delimiter='╬')
    writer = csv.writer(outfile, delimiter='|')
    for row in reader:
        writer.writerow(row)

Адаптировано из документов

0 голосов
/ 28 февраля 2019
with i as open(filename):
    with o as open(filename+'.new', 'w+):
        for line in i.readlines():
            o.write(line.replace('╬', '|'))

или, пропустите питон и используйте sed со своего терминала:

$ sed -i 's/╬/|/g' *.csv

Если исходный разделитель не появляется ни в одной из экранированных строк, этодолжно быть немного быстрее, чем при использовании обычного csv модуля.Кажется, что при чтении CSV-файлов у Panada есть какая-то файловая система вуду, поэтому я не удивлюсь, если она будет такой же быстрой.sed почти наверняка победит их обоих.

...