Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.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,我有一个大的单列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

我有一个大的单列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(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是的..您知道了..非常感谢