Python使用两列将文本写入CSV
嗨,我有个小问题 我有一个带数字的文本文件,看起来像这样Python使用两列将文本写入CSV,python,csv,Python,Csv,嗨,我有个小问题 我有一个带数字的文本文件,看起来像这样 2.131583 2.058964 6.866568 0.996470 6.424396 0.996004 6.421990 和 fList = [s.strip() for s in open('out.txt').readlines()] outStr = '' for i in fList: outStr += (i+',') f = open('text_to_csv.csv', 'w') f.write(outSt
2.131583
2.058964
6.866568
0.996470
6.424396
0.996004
6.421990
和
fList = [s.strip() for s in open('out.txt').readlines()]
outStr = ''
for i in fList:
outStr += (i+',')
f = open('text_to_csv.csv', 'w')
f.write(outStr.strip())
f.close()
我能够生成一个CSV,所有数据都存储在其中,但都在一行中。
我想把它们分为两列
是否有任何简单的添加可以使CSV看起来像这样
2.131583 2.058964
6.866568 0.996470
6.424396 0.996004
如果内存中有一个列表(通过读取文件),只需将列表重新格式化为所需格式:
input='''\
2.131583
2.058964
6.866568
0.996470
6.424396
0.996004
6.421990'''
cols=2
data=input.split() # proxy for a file
print data
print '==='
for li in [data[i:i+cols] for i in range(0,len(data),cols)]:
print li
印刷品:
['2.131583', '2.058964', '6.866568', '0.996470', '6.424396', '0.996004', '6.421990']
===
['2.131583', '2.058964']
['6.866568', '0.996470']
['6.424396', '0.996004']
['6.421990']
或者,使用一次读取N个文件的习惯用法:
import itertools
cols=2
with open('/tmp/nums.txt') as fin:
for li in itertools.izip_longest(*[fin]*cols):
print li
# prints
('2.131583\n', '2.058964\n')
('6.866568\n', '0.996470\n')
('6.424396\n', '0.996004\n')
('6.421990', None)
如果需要一种类型的文件过滤器,可以将其组合为一个迭代器输入,一个迭代器输出:
import itertools
cols=2
with open('/tmp/nums.txt') as fin, open('/tmp/nout.txt','w') as fout:
for li in itertools.izip_longest(*[fin]*cols):
fout.write('\t'.join(e.strip() for e in li if e)+'\n')
输出文件现在将是:
2.131583 2.058964
6.866568 0.996470
6.424396 0.996004
6.421990
如果只想写入的输出,则存在完整的数字集,即文件末尾的剩余数字的总长度小于cols
:
import itertools
cols=2
# last number '6.421990' not included since izip is used instead of izip_longest
with open('/tmp/nums.txt') as fin, open('/tmp/nout.txt','w') as fout:
for li in itertools.izip(*[fin]*cols):
fout.write('\t'.join(e.strip() for e in li)+'\n')
那么输出文件是:
2.131583 2.058964
6.866568 0.996470
6.424396 0.996004
大概是这样的:
with open('out.txt', 'r') as fList, open('text_to_csv.csv', 'w') as f:
i = 0
for line in fList:
f.write(line)
f.write('\n' if i% 2 == 0 else '\t')`
如果您对将原始文件中的条目存储在新列表中不感兴趣,而只需要输出文件,也可以执行以下操作:
fList = [s.strip() for s in open('out.txt').readlines()]
f = open('text_to_csv.csv', 'w')
for i in range(0,len(fList)-1,2):
f.write(fList[i] + "," + fList[i+1] + "\n")
f.close()
更好的方法是使用csv模块。你可以这样写
import csv
with open('text_to_csv.csv', 'wb') as csvfile:
writer = csv.writer(csvfile, delimiter=',',quoting=csv.QUOTE_MINIMAL)
for i in range(0, len(fList), 2):
writer.writerow(fList[i:i+2])
我不太清楚你的意思,但我认为你的预期产出是:
2.131583,2.058964,
6.866568,0.996470,
6.424396,0.996004,
6.421990
我的代码:
with open('out.txt', 'r') as fif, open('text_to_csv.csv', 'w') as fof:
fList = ','.join([v.strip() if i % 2 else '\n'+v.strip()
for i, v in enumerate(fif.readlines())])[1:]
fof.write(fList)
有趣的是: 如果您想去掉文件末尾的尾随“,”,只需通过
join()
函数连接列表即可
flat_string=','。连接([item1,…])
对于列表中奇数项的前导换行符,我已经列举了它
索引,值枚举([item1,…])
并通过模运算符索引%2
查找奇数项
通过“内联如果”,您可以在运行中检查这一点
至少我用
[1:][/code>排除了字符串开头多余的换行符。您可能还想查看列表中的最后一个数字。您真的想丢失列表中的最后一个数字吗?非常感谢,这对我帮助很大,count=0导致第一行只有一个值,count=1使其正确。
with open('out.txt', 'r') as fif, open('text_to_csv.csv', 'w') as fof:
fList = ','.join([v.strip() if i % 2 else '\n'+v.strip()
for i, v in enumerate(fif.readlines())])[1:]
fof.write(fList)