Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python使用两列将文本写入CSV_Python_Csv - Fatal编程技术网

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)