繁体   English   中英

将文件从.txt转换为.csv不会写入最后一列数据

[英]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)

讨论

  1. 调用split()而不用任何参数做正确的事情:用空格分割,甚至用多个空格分割
  2. 如果您的输入文件很大,则不应将它们放入列表( data )中,而是处理每一行并写入,这会使其更快并且需要更少的内存。

更新

试试看你是否可以消除空白行:

    writer.writerows(row.split() for row in infile if row.strip())

更新2

让我们再试一下帕特琼斯的建议(我认为他的意思是先剥离,然后分裂):

    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个步骤:

  • 分裂线
  • 将条目插入数据列表
  • 打印csv

找出哪个步骤失败,例如通过扩展脚本,如下所示:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM