我正在尝试从大型制表符分隔的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时,我不确定如何动态进行重新编码。
答案 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 expression:1 if row[i] > 0 else 0
。一般表单A if cond else B
的评估结果为A
或B
,具体取决于条件。
另一种形式,我认为"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)