我正在尝试将文本文件转换为CSV,以简化其他应用程序的工作流程。我遇到的问题是,提供的文本文件在文件中有多余的空间,并且在使用pandas导出为CSV时读取到一列中。我试过了指定列的名称作为参数,但它不工作。
文本文件是这样读的,
85350 5211 APPLE LN O
85805 201 ORANGE ST I
84412 1313 BANANA RD I
导出为CSV格式,如下所示,
85350 5211 APPLE LN O,
85805 201 ORANGE ST I,
84412 1313 BANANA RD I
我希望导出的CSV有列,看起来类似于这样,列是数字地址In_Out,
Number,Address,In_Out
85350,5211 APPLE LN,O
85805,201 ORANGE ST,I
84412,1313 BANANA RD,I
pandas
有一个读取固定宽度文本文件的方法。如果默认的推断列不正确,还有其他参数来指示列的宽度,但在这种情况下它可以工作:
import pandas as pd
df = pd.read_fwf('input.txt', header=None)
df.to_csv('output.csv', index=False, header=['Number','Address','In_Out'])
output.csv:
Number,Address,In_Out
85350,5211 APPLE LN,O
85805,201 ORANGE ST,I
84412,1313 BANANA RD,I
问题是您的文件有空格,但地址也有空格。但是第一列和最后一列没有所以你可以这样写:
import sys
for line in sys.stdin:
line = line.strip()
left, right = line.split( ' ', 1 )
mid, right = right.rsplit( ' ', 1 )
print( ",".join( [left,mid,right] ) )
,它会给你这个:
$ python test.py < data.file
85350, 5211 APPLE LN ,O
85805, 201 ORANGE ST ,I
84412, 1313 BANANA RD ,I
但是你也可以尝试pandas read_fwf,因为你的文件看起来是固定宽度的。
>>> a = pandas.read_fwf( 'data.file', widths=[8,28,1], names=('Zip','Address','Status') )
>>> a
Zip Address Status
0 85350 5211 APPLE LN O
1 85805 201 ORANGE ST I
2 84412 1313 BANANA RD I
rows=[]
#Open csv module create the file to write it to etc etc etc
with open('file.txt') as f:
row=[]
for line in f.readlines():#gets each and every line from the file
words=line.split()#splitting each word at space
row=[words[0],f"{words[1]} {words[2]} {words[3]}",words[4]]
rows.append(row)#appending to the rows list
csv.writerows(rows)