2015-03-23 2 views
1

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

var1|var2|var3|tonumber|fromnumber|var|coding|udh|var|circle|var|var|var|var15 

898980d1-6e5b-40f2-a313-c30f08bf0fe6|49A5919EB0D04EDE9B6CEB5AF932EAA3|sbs1|919899980898|HITECH|1|1|0|VODAFONE|Delhi|2015-02-21 12:08:51|5|3|RBA/6724R # Kailash Ram Panwar (PL) # Rz-410/13 Flat No-09 Iiird Floor Tkd Extn Delhi - 110019-110019 # Tgt Skt # # 

Как преобразовать этот файл в CSV? Я пробовал:

In [1]: import csv 

In [2]: import pandas as pd 

In [3]: piperows = [] 

f = open("/home/suri/ValueFirst/MT.txt", "rb") 

In [6]: readerpipe = csv.reader(f, delimiter = '|') 

In [7]: for row in readerpipe: 
    ...:  piperows.append(row) 
    ...:  f.close() 
    ...: 

И я получил ошибку ниже:

---------------------------------------------------- 
ValueError      Traceback (most recent call last) 
<ipython-input-7-842b0d42f436> in <module>() 
----> 1 for row in readerpipe: 
     2  piperows.append(row) 
     3  f.close() 
     4 

ValueError: I/O operation on closed file 

ответ

5

Как @Martijn Питерс предложил , вы не должны иметь отступ f.close() таким образом, потому что теперь он является частью цикла. Я бы предложил использовать блок с блоком, который позаботится об автоматическом закрытии файла.

import csv 

with open("/home/suri/ValueFirst/MT.txt", "rb") as f: 
    readerpipe = csv.reader(f, delimiter='|') 
    piperows = list(readerpipe) 

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

import csv 

with open("/home/suri/ValueFirst/MT.txt", "rb") as file_pipe: 
    reader_pipe = csv.reader(file_pipe, delimiter='|') 
    with open("/home/suri/ValueFirst/MT.csv", 'wb') as file_comma: 
     writer_comma = csv.writer(file_comma, delimiter=',') 
     for row in reader_pipe: 
      writer_comma.writerow(row) 

Edit: @Martijn предлагает передать читателю непосредственно writerows метода писателя ... Если этот метод writerows правильно реализован он будет иметь тот же эффект и избежать загрузки всех строк в памяти один раз.

import csv 

with open("/home/suri/ValueFirst/MT.txt", "rb") as file_pipe: 
    reader_pipe = csv.reader(file_pipe, delimiter='|') 
    with open("/home/suri/ValueFirst/MT.csv", 'wb') as file_comma: 
     writer_comma = csv.writer(file_comma, delimiter=',') 
     writer_comma.writerows(reader_pipe) 

Edit 2: код становится настолько прост, что вы могли бы встраивать читатель и писатель переменные и получить следующее, если вы хотите ...

import csv 

with open("/home/suri/ValueFirst/MT.txt", "rb") as file_pipe: 
    with open("/home/suri/ValueFirst/MT.csv", 'wb') as file_comma: 
     csv.writer(file_comma, delimiter=',').writerows(csv.reader(file_pipe, delimiter='|')) 
+0

мне нужно данные как CSV он должен выглядеть следующим образом: вар var1 var2 var3 XYT cagf sfgb Самгук саги AFFF afgg sggg aggb выше answe r даст такие данные? , пожалуйста, помогите мне таким образом – surendra

+0

Код, который я предложил, изменит файл, похожий на 'header1 | header2 | header3'' var1 | var2 | var3' в 'header1, header2, header3'' var1, var2, var3'. Если вам нужно что-то другое, отредактируйте свой вопрос, чтобы сделать его более понятным: это более читаемо, чем встроенные комментарии;) – snooze92

2

Вы закрываете файл после прочтения первой строки:

for row in readerpipe: 
    piperows.append(row) 
    f.close() 

Удалите f.close() линию из петли.

Еще лучше, используйте файл в качестве менеджера контекста, чтобы он автоматически закрывался для вас. Вы можете просто позвонить list() на читателя, чтобы произвести список вывода:

with open("/home/suri/ValueFirst/MT.txt", "rb") as f: 
    readerpipe = csv.reader(f, delimiter = '|') 
    piperows = list(readerpipe) 

но преобразовать файл, вы можете перейти в readerpipe прямо в writer.writerows() вызова:

with open("/home/suri/ValueFirst/MT.txt", "rb") as f: 
    readerpipe = csv.reader(f, delimiter = '|') 
    with open("/home/suri/ValueFirst/MT.txt", "wb") as outputfile: 
     writer = csv.writer(outputfile) 
     writer.writerows(readerpipe) 
Смежные вопросы