使用python将特定csv单元格的数据写入另一个文件

时间:2016-11-21 19:11:23

标签: python arrays csv numpy readfile

我在csv文件中有数据,需要将特定单元格的内容放在其他文件中。这是csv文件的简化版本。

A;B;C;D
A1;B1;C1;D1
A2;B2;C2;D2
A3;B3;C3;D3
A4;B4;C4;D4

应该将csv文件转换为二维数组,最好是numpy。之后,数组中的数据应写入其他一些文件中。这是简化代码的片段。

import numpy
table = numpy.genfromtxt('table.csv', delimiter=';', skip_header=1)

for row in range (4):
    output = open('array %s.txt' %(row+1), 'w')
    for clmn in range (4):
        output.write('%s' %table[row][clmn])

output.close()

我一直在寻找一种将数据放入数组的正确方法。任何想法如何实现或你发现我犯了什么错误?

编辑:我发现了问题。 numpy未正确安装。 我还必须对代码进行一些调整。

import numpy

#get table size
table = numpy.genfromtxt('table.csv', delimiter=';')
rows, cols = table.shape

#get table data
table = numpy.recfromtxt('table.csv', delimiter=';', dtype=str)

#write table in different files
for row in range(rows):
    output = open('array %s.txt' %row, 'w')
    for clmn in range(cols):
        output.write('%s\t' %table[row][clmn])
    output.close()

这是新代码,它按预期输出文件

array 0.txt A B C D

array 1.txt A1 B1 C1 D1

array 2.txt A2 B2 C2 D2

array 3.txt A3 B3 C3 D3

array 4.txt A4 B4 C4 D4

3 个答案:

答案 0 :(得分:1)

output.close()必须在循环中,尝试使用它:

import numpy

table = numpy.genfromtxt('table.csv', delimiter=';', skip_header=1)
rows, cols = table.shape
for row in range(rows):
    output = open('array %s.txt' % (row + 1), 'w')
    for clmn in range(cols):
        output.write('%s\t' % table[row][clmn])

    output.close()

答案 1 :(得分:0)

如果你不需要numpy数组,那么这样的东西可能适合你。

import csv

with open('table.csv', 'r') as csv_file:
   reader = list(csv.reader(csv_file, delimiter=';'))

   # skips header line
   for row in range(1, len(reader)):
      with open('array %s.txt' % row, 'w') as out_file:
         for i in reader[row]:
            # Modify this line to change what the output file contains
            out_file.write('%s' % i)

答案 2 :(得分:0)

你可以用np.savetxt写一个csv;

例如,将您的示例视为文字(它是否真的浮动?)

In [1]: txt = b"""A;B;C;D
   ...: A1;B1;C1;D1
   ...: A2;B2;C2;D2
   ...: A3;B3;C3;D3
   ...: A4;B4;C4;D4
   ...: """.splitlines()

In [7]: table= np.genfromtxt(txt,delimiter=';',skip_header=1,dtype='U2')
In [8]: table
Out[8]: 
array([['A1', 'B1', 'C1', 'D1'],
       ['A2', 'B2', 'C2', 'D2'],
       ['A3', 'B3', 'C3', 'D3'],
       ['A4', 'B4', 'C4', 'D4']], 
      dtype='<U2')
In [9]: np.savetxt('test.csv',table,header='A,B,C,D',delimiter=',',fmt='%3s')
In [10]: cat test.csv
# A,B,C,D
 A1, B1, C1, D1
 A2, B2, C2, D2
 A3, B3, C3, D3
 A4, B4, C4, D4

在这里,我使用不同的分隔符和格式编写了相同的值。

savetxt,基本上

 for row in table:
    f.write(fmt%tuple(row))

其中fmt是您完整提供的,或者是从fmt创建的:

In [11]: np.savetxt('test.csv',table,header='A,B,C,D',fmt='%s %s  %s   %s')
In [12]: cat test.csv
# A,B,C,D
A1 B1  C1   D1
...

所以你可以修改你的写作:

In [13]: for row in table:
    ...:     print('%s %s,%s;%s'%tuple(row))
    ...:     
A1 B1,C1;D1
A2 B2,C2;D2
A3 B3,C3;D3
A4 B4,C4;D4