Python 将单列csv文件拆分为不相等的部分
我有一个大的单列csv文件,我想将其分割成小块:Python 将单列csv文件拆分为不相等的部分,python,csv,Python,Csv,我有一个大的单列csv文件,我想将其分割成小块: 1 2 3 4 5 6 7 8 9 10 这样,输出csv应该如下所示: 1 | 3 | 6 | 8 | 2 | 4 | 7 | 9 | * | 5 | * | 10 | 及 *表示列中没有数字 在这方面谁能帮我一下吗。 谢谢一个丑陋但简单的解决方案: import csv from itertools import izip def split_2_3(filena
1
2
3
4
5
6
7
8
9
10
这样,输出csv应该如下所示:
1 | 3 | 6 | 8 |
2 | 4 | 7 | 9 |
* | 5 | * | 10 |
及
*
表示列中没有数字
在这方面谁能帮我一下吗。
谢谢一个丑陋但简单的解决方案:
import csv
from itertools import izip
def split_2_3(filename):
with open(filename) as f:
it = (line.strip() for line in f)
while True:
yield next(it), next(it), "*"
yield next(it), next(it), next(it)
with open("output.csv", "w") as f:
output = csv.writer(f, delimiter="|")
output.writerows(izip(*split_2_3("input.txt")))
可以在输入文件中保留任意行数的解决方案:
import csv
def split_2_3(filename,cnt = 0):
dd = {0:[],1:[],2:[]}
ecr = []
with open(filename) as f:
for i,line in enumerate(f):
ecr.append('\nline %d : %r\n' % (i,line))
if (i+cnt-2)%6:
ecr.append('%r put in dd[%d]\n'
% (line.strip(),(i+cnt)%3))
dd[(i+cnt)%3].append(line.strip())
else:
ecr.append("'*' put in dd[%d]"
% ((i+cnt)%3 ))
dd[(i+cnt)%3].append('*')
cnt += 1
ecr.append(' and %r put in dd[%d]\n'
% (line.strip(),(i+cnt)%3))
dd[(i+cnt)%3].append(line.strip())
print ''.join(ecr)
yield dd[0]
yield dd[1]
yield dd[2]
with open("output.csv", "wb") as f:
output = csv.writer(f, delimiter="|")
output.writerows(split_2_3("input.txt"))
例如,输入文件有13行:
line 0 : '1\n'
'1' put in dd[0]
line 1 : '2\n'
'2' put in dd[1]
line 2 : '3\n'
'*' put in dd[2] and '3' put in dd[0]
line 3 : '4\n'
'4' put in dd[1]
line 4 : '5\n'
'5' put in dd[2]
line 5 : '6\n'
'6' put in dd[0]
line 6 : '7\n'
'7' put in dd[1]
line 7 : '8\n'
'*' put in dd[2] and '8' put in dd[0]
line 8 : '9\n'
'9' put in dd[1]
line 9 : '10\n'
'10' put in dd[2]
line 10 : '11\n'
'11' put in dd[0]
line 11 : '12\n'
'12' put in dd[1]
line 12 : '13\n'
'*' put in dd[2] and '13' put in dd[0]
line 13 : '\n'
'' put in dd[1]
以及输出CSV文件中的结果:
1|3|6|8|11|13
2|4|7|9|12|
*|5|*|10|*
编辑
要回答senderle指出的问题(请注意,我在代码中添加了ljust(5),以使output.csv内容的显示更清晰:
import csv
def split_2_3(filename,cnt = 0):
dd = {0:[],1:[],2:[]}
ecr = []
with open(filename) as f:
for i,line in enumerate(f):
ecr.append('\nline %d : %r\n' % (i,line))
if (i+cnt-2)%6:
ecr.append('%r put in dd[%d]\n'
% (line.strip(),(i+cnt)%3))
dd[(i+cnt)%3].append(line.strip().rjust(5))
else:
ecr.append("'*' put in dd[%d]"
% ((i+cnt)%3 ))
dd[(i+cnt)%3].append('*'.rjust(5))
cnt += 1
ecr.append(' and %r put in dd[%d]\n'
% (line.strip(),(i+cnt)%3))
dd[(i+cnt)%3].append(line.strip().rjust(5))
while (i+cnt)%3!=2:
i += 1
dd[(i+cnt)%3].append('*'.rjust(5))
print ''.join(ecr)
yield dd[0]
yield dd[1]
yield dd[2]
with open("output.csv", "wb") as f:
output = csv.writer(f, delimiter="|")
output.writerows(split_2_3("input.txt"))
文件input.txt包含:“1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11”
创建的ouput.csv为
1 |3 |6 |8 |11
2 |4 |7 |9 |*
* |5 |* |10 |*
文件input.txt包含:“1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n”
结果output.csv是相同的 文件input.txt包含:
'1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n\r\n'
结果是:
1 |3 |6 |8 |11
2 |4 |7 |9 |
* |5 |* |10 |*
文件input.txt包含:'1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n\r\n\r\n' output.txt变为:
1 |3 |6 |8 |11 |
2 |4 |7 |9 | |*
* |5 |* |10 |* |*
如果有带空格的行而不仅仅是“\r\n”,则结果在视觉上是相同的,但是output.csv文件中记录的值将是空白的您如何确定
*
应放在哪里?您将如何决定哪些列应该有一个空格,哪些列应该得到“额外”数字?(与塔德克的问题相同)@纳文:现在还完全不清楚你想要的输出背后的逻辑是什么。如果输入文件中有九行或十二行,输出应该是什么样子?@Navin我还不清楚序列2,3,2,3,2,3从何而来。你总是希望第一列有2个数字,第二列有3个,第三列有2个……等等p扩展总列数以适应您的总条目数?@Hooked是的..您知道了..非常感谢