Преобразование txt файла с разделителями-табуляторами в файл csv с использованием Python
Итак, я хочу преобразовать простой текстовый файл с разделителями табуляции в файл csv. Если я преобразую txt файл в строку, используя string.split('\n'), я получаю список с каждым элементом списка как строку с '\ t' между каждым столбцом. Я думал, что могу просто заменить "\ t" запятой, но он не будет обрабатывать строку в списке как строку и разрешить мне использовать string.replace. Вот начало моего кода, который все еще нуждается в способе анализа вкладки "\ t".
import csv
import sys
txt_file = r"mytxt.txt"
csv_file = r"mycsv.csv"
in_txt = open(txt_file, "r")
out_csv = csv.writer(open(csv_file, 'wb'))
file_string = in_txt.read()
file_list = file_string.split('\n')
for row in ec_file_list:
out_csv.writerow(row)
Ответы
Ответ 1
csv
поддерживает файлы с разделителями табуляции. Поставьте аргумент delimiter
в reader
:
import csv
txt_file = r"mytxt.txt"
csv_file = r"mycsv.csv"
# use 'with' if the program isn't going to immediately terminate
# so you don't leave files open
# the 'b' is necessary on Windows
# it prevents \x1a, Ctrl-z, from ending the stream prematurely
# and also stops Python converting to / from different line terminators
# On other platforms, it has no effect
in_txt = csv.reader(open(txt_file, "rb"), delimiter = '\t')
out_csv = csv.writer(open(csv_file, 'wb'))
out_csv.writerows(in_txt)
Ответ 2
Почему вы всегда должны использовать режим "rb" при чтении файлов с помощью модуля csv
:
Python 2.7.2 (default, Jun 12 2011, 15:08:59) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Что в файле примера: любой старый мусор, включая контрольные символы, полученные путем извлечения капли или что-либо из базы данных, или вредное использование функции CHAR
в формулах Excel или...
>>> open('demo.txt', 'rb').read()
'h1\t"h2a\nh2b"\th3\r\nx1\t"x2a\r\nx2b"\tx3\r\ny1\ty2a\x1ay2b\ty3\r\n'
Python следует за CP/M, MS-DOS и Windows при чтении файлов в текстовом режиме: \r\n
распознается как разделитель строк и подается как \n
, а \x1a
aka Ctrl-Z признанный маркером END-OF-FILE.
>>> open('demo.txt', 'r').read()
'h1\t"h2a\nh2b"\th3\nx1\t"x2a\nx2b"\tx3\ny1\ty2a' # WHOOPS
csv с файлом, открытым с помощью "rb" работает как ожидалось:
>>> import csv
>>> list(csv.reader(open('demo.txt', 'rb'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\r\nx2b', 'x3'], ['y1', 'y2a\x1ay2b', 'y3']]
но текстовый режим не работает:
>>> list(csv.reader(open('demo.txt', 'r'), delimiter='\t'))
[['h1', 'h2a\nh2b', 'h3'], ['x1', 'x2a\nx2b', 'x3'], ['y1', 'y2a']]
>>>