2012-04-19 2 views
18

Так что я хочу преобразовать простой текстовый файл с разделителями табуляции в файл csv. Если я преобразую txt-файл в строку, используя string.split ('\ n'), я получаю список с каждым элементом списка как строку с '\ t' между каждым столбцом. Я думал, что могу просто заменить «\ t» запятой, но он не будет обрабатывать строку в списке как строку и разрешить мне использовать string.replace. Вот начало моего кода, который все еще нуждается в способе анализа вкладки «\ t».Конвертировать txt-файл с разделителями-разделителями в файл csv с использованием Python

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) 

ответ

35

csv поддерживает файлы с разделителями табуляции. Поставляем delimiter argument to 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) 
+1

-1 Вы предполагая, что ОП на Python 2.x; в этом случае входной файл должен быть открыт с режимом «rb». Также не гарантирует, что по крайней мере выходной файл закрыт, предпочтительно оба файла. –

+3

bikeshedding. Оба файла закрываются, как только скрипт завершается. Что есть .. сразу. +1. – ch3ka

+1

@JohnMachin Я ничего не предполагал. Я изменил как можно меньше, чтобы показать, как преобразовать файл. 'with' не требуется, если программа будет немедленно завершена - файл будет закрыт. Я добавил комментарий, чтобы указать, что следует соблюдать осторожность, если это долгосрочная программа. – agf

2

Почему вы всегда должны использовать режим «Р.Б.» при чтении файлов с 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 распознается как КОНЕЦ-ФАЙЛ маркер.

>>> open('demo.txt', 'r').read() 
'h1\t"h2a\nh2b"\th3\nx1\t"x2a\nx2b"\tx3\ny1\ty2a' # WHOOPS 

CSV с файла, открываемого с 'гб' работает, как ожидалось:

>>> 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']] 
>>> 
+0

У вас есть ссылка на python.org для поведения Ctrl-z? Я не вижу упоминания об этом. – agf

+1

@agf: Нет. Это следствие того, что CPython 2.X делегирует ответственность за решение, что делать с библиотекой 'C'' stdio' целевого компилятора. –

Смежные вопросы