从一个csv文件写入和重新编码到另一个

时间:2016-03-31 20:32:42

标签: python csv

我正在尝试从大型制表符分隔的CSV文件中选择特定列,并仅将某些列输出到新的CSV文件。此外,我希望在发生这种情况时重新编码数据。如果单元格的值为0,则只输出0.但是,如果单元格的值大于0,则只输出1(即,所有大于0的值都编码为1)。

这是我到目前为止所拥有的:

import csv

outputFile = open('output.csv', 'wb')
outputWriter = csv.writer(outputFile)
included_cols = range(9,2844)

with open('source.txt', 'rb') as f:
    reader = csv.reader(f, delimiter='\t')
    for row in reader:
        content = list(row[i] for i in included_cols)
        outputWriter.writerow(content)

我遇到的第一个问题是我还要从第6列开始。我不知道如何编写第6列,然后编写第9-2844列。

其次,在编写新CSV时,我不确定如何动态进行重新编码。

2 个答案:

答案 0 :(得分:0)

  

我不知道如何编写第6列,然后编写第9-2844列。

included_cols = [6] + list(range(9,2844))

这是因为you can add two lists together。请注意,在Python3中,range不返回列表,因此我们必须强制它。

  

我不确定如何动态进行重新编码

content = list((1 if row[i] > 0 else 0) for i in included_cols)

这是因为conditional expression1 if row[i] > 0 else 0。一般表单A if cond else B的评估结果为AB,具体取决于条件。

另一种形式,我认为"too clever by half"content = list((row[i] and 1) for i in included_cols)。这是有效的,因为and operator总是返回其中一个或另一个输入。

答案 1 :(得分:0)

这应该有效:

import csv

outputFile = open('output.csv', 'wb')
outputWriter = csv.writer(outputFile)
included_cols = [5] + range(8,2844) # you can just merge two lists

with open('source.txt', 'rb') as f:
    reader = csv.reader(f, delimiter='\t')
    outputWriter.writerow(reader[0]) # write header row unchanged
    for row in reader[1:]: # skip header row
        content = [int(row[i]) if i == 5 else (0 if int(row[i]) == 0 else 1) for i in included_cols]
        outputWriter.writerow(content)