用Python将csv行转换为列

2024-10-01 22:43:50 发布

您现在位置:Python中文网/ 问答频道 /正文

你能帮帮我吗?在

我需要转换:

  • 一行多列来自多个文件

  • 一个文件

在哪里

  • 文件数等于列数
  • 行数等于输入文件中的列数。在

输入文件

文件1: 32676;90;5;22;…;4

文件2: 255;35;88;17;…;151

文件3: 551;86;442;78;20

输出文件

32676;255;551

35岁;86岁

90;88;442

5;17

22;78

。。。;。。。;。。。在

4;151;20

非常感谢你的帮助!在

My code :

path = 'D:\Users\mim\Desktop\SI\Test_cvs'
pathglobalcsv = 'D:\Users\mim\Desktop\SI'

#create a new file
globalfile = open(os.path.join(pathglobalcsv, 'global.csv'), 'w+')

#write filenames like column names
files = os.listdir(path)
globalfile.write(';'.join(files))
globalfile.write('\n')

#get all values
for filename in glob.glob(os.path.join(path, '*.csv')):
    csvfile = open(filename, 'r')
    textcsv = csv.reader(csvfile, delimiter=';')
    globalfile.write(zip(*textcsv))

I have an error : 

Traceback (most recent call last):
  File "C:\Users\mim\eclipse-workspace\test\csv_global.py", line 86, in <module>
    globalfile.write(zip(*textcsv))
TypeError: expected a string or other character buffer object

Tags: 文件csvpathosopenuserswritejoin
2条回答

关于如何使用zip合并数据以及转置列表的一些提示。 这听起来像是如何转置csv是你真正的问题。如何转置csv的答案是将其放入列表列表(例如通过csv模块),然后将其转置并写回文件(如果需要)。在

row1 = [1,2,3]

row2 = ['a', 'b', 'c']

list(zip(row1, row2))
Out[45]: [(1, 'a'), (2, 'b'), (3, 'c')]

z = list(zip(row1, row2))

list(zip(*z))
Out[47]: [(1, 2, 3), ('a', 'b', 'c')]

y = list(zip(*z))

y
Out[49]: [(1, 2, 3), ('a', 'b', 'c')]

list(zip(*y))
Out[50]: [(1, 'a'), (2, 'b'), (3, 'c')]

或者,如果您安装了numpy或pandas,这两种方法都可以在最多3行代码中使用read_file/transpose_matrix/write_transposed_to_文件

所以根据你的代码,我会读所有的文件,把它们放在内存里,然后再进行转置写。我想如果你改变这一部分,它会成功的(我没有亲自测试)。在

^{pr2}$

如果每个原始文件没有严格的1行,那么将得到有趣的结果。在

更新: 我举了一个小例子。在

files = list('abcd')
file_rows = [files]
for filename in [range(i, i+4) for i in range(0, 12, 4)]:
    tmp_rows = []
    fake_csv = [list(filename)]
    for row in fake_csv:
        tmp_rows += [row] # change to [row, row] to see what happens
                          # in case of multiple rows in original csv
    file_rows += tmp_rows
transposed = list(zip(*file_rows))
print(transposed)

在完成测试代码之后,我稍微调整了一下原始代码,使其列在列表中,这是唯一的事情。所以,如果你在改变之后仍然得到有趣的结果,那是因为你没有统一的输入数据,在这种情况下,你需要决定如何处理。例如,zip将静默地只输出所有原始行的最短列表的长度。要修复此问题,您需要以代码方式添加到,以便所有列表的长度与最长的行相同。在

我找到了一个解决办法。。。在

globalfile = open(os.path.join(pathglobalcsv, 'global.csv'), 'wb')    
for filename in glob.glob(os.path.join(path, '*.csv')):
        csvfile = open(filename, 'r')
        with csvfile :
            textcsv = csv.reader(csvfile, delimiter=';')
            for row in textcsv:
                textlist = zip(list(row))
                column = pd.DataFrame(textlist)
                column.to_csv(globalfile, sep=';', header=False, index=False)

但实际上结果是:

32676个

90度

22个

。。。在

255个

35岁

88个

17

。。。在

151

如何从32676之后的第二个文件开始写入值? 谢谢!在

-*。*-

[正确答案]:

^{pr2}$

相关问题 更多 >

    热门问题