[英]converting file from .txt to .csv doesn't write last column of data
我有一个文本文件,我试图转换为.csv文件,并在每个字符之间有空格的实例中将所有数据分成列。 以下代码正在执行此操作,但它不会写入最后一列数据。
txt_file = r'ATF_160A_AR-160B_Pr_Temp_test.txt'
data = []
with open(txt_file) as f:
for line in f:
data.append([word for word in line.split(' ') if word])
csv_file = r'ATF_160A_AR-160B_Pr_Temp_test.csv'
out_csv = csv.writer(open(csv_file, 'wb'))
out_csv.writerows(data)
文本文件如下所示。
odbName stepName instanceName setName tmax_F tmax_C xcoord
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.345 420.747 0.0
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 751.559 399.755 0.1244
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.300 420.722 0.004976
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.193 420.663 0.009952
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.017 420.565 0.014928
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 788.770 420.428 0.019904
这是我的尝试:
txt_file = r'ATF_160A_AR-160B_Pr_Temp_test.txt'
csv_file = r'ATF_160A_AR-160B_Pr_Temp_test.csv'
with open(txt_file) as infile, open(csv_file, 'w') as outfile:
writer = csv.writer(outfile)
writer.writerows(row.split() for row in infile)
split()
而不用任何参数做正确的事情:用空格分割,甚至用多个空格分割 data
)中,而是处理每一行并写入,这会使其更快并且需要更少的内存。 试试看你是否可以消除空白行:
writer.writerows(row.split() for row in infile if row.strip())
让我们再试一下帕特琼斯的建议(我认为他的意思是先剥离,然后分裂):
writer.writerows(row.strip().split() for row in infile if row.strip())
当我在你提供的输入数据上运行你的代码,但是放入几个打印语句来查看它在做什么时,我注意到最后一列中条目的换行符:
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '789.345', '420.747', '0.0\n']
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '751.559', '399.755', '0.1244\n']
我可能会在写出之前剥掉它们,因为它们经常会产生不可预见的影响:
data.append([word.strip('\n') for word in line.split(' ') if word])
csv.writer的doc说如果目标是一个打开的文件,它应该用newline=''
打开。 我很确定它不应该以二进制(字节)模式打开。 以下代码,编码用于开发(不使用外部文件),
import csv
from io import StringIO
f = '''\
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.345 420.747 0.0
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 751.559 399.755 0.1244
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.300 420.722 0.004976
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.193 420.663 0.009952
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 789.017 420.565 0.014928
abcd-1_AB.odb Nominal SPECIMEN_POS1-1 SET-1 788.770 420.428 0.019904
'''.splitlines()
data = []
for line in f:
data.append([word for word in line.split(' ') if word])
for line in data: print(line)
out = StringIO()
writer = csv.writer(out)
writer.writerows(data)
for line in out.getvalue().splitlines(): print(line)
版画
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '789.345', '420.747', '0.0']
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '751.559', '399.755', '0.1244']
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '789.300', '420.722', '0.004976']
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '789.193', '420.663', '0.009952']
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '789.017', '420.565', '0.014928']
['abcd-1_AB.odb', 'Nominal', 'SPECIMEN_POS1-1', 'SET-1', '788.770', '420.428', '0.019904']
abcd-1_AB.odb,Nominal,SPECIMEN_POS1-1,SET-1,789.345,420.747,0.0
abcd-1_AB.odb,Nominal,SPECIMEN_POS1-1,SET-1,751.559,399.755,0.1244
abcd-1_AB.odb,Nominal,SPECIMEN_POS1-1,SET-1,789.300,420.722,0.004976
abcd-1_AB.odb,Nominal,SPECIMEN_POS1-1,SET-1,789.193,420.663,0.009952
abcd-1_AB.odb,Nominal,SPECIMEN_POS1-1,SET-1,789.017,420.565,0.014928
abcd-1_AB.odb,Nominal,SPECIMEN_POS1-1,SET-1,788.770,420.428,0.019904
对于期望字符串而不是字节的目标,writer会写入所有字段。
如果您知道输入文件从不包含',',则可以跳过使用csv并使用','.join(word for word in line.split(' '))
创建输出行,并使用outfile.write
写入它们。
在我的系统上,添加import csv
并用line.split(' ')
替换line.split(' ')
line.strip().split(' ')
按其他人的建议line.strip().split(' ')
,你的脚本按预期运行。
至少涉及3个步骤:
找出哪个步骤失败,例如通过扩展脚本,如下所示:
import csv
txt_file = r'ATF_160A_AR-160B_Pr_Temp_test.txt'
data = []
with open(txt_file) as f:
for line in f:
print line
for word in line.strip().split(' '):
print bool(word), ": ", word
data.append([word for word in line.strip().split(' ') if word])
print data
csv_file = r'ATF_160A_AR-160B_Pr_Temp_test.csv'
out_csv = csv.writer(open(csv_file, 'wb'))
out_csv.writerows(data)
在您的情况下,哪一步不能产生预期的输出?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.