Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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文件写入和重新编码到另一个csv文件_Python_Csv - Fatal编程技术网

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

Python 从一个csv文件写入和重新编码到另一个csv文件,python,csv,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)

我试图从一个以制表符分隔的大型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时动态地重新编码

我不知道如何写第6栏,然后写第9-2844栏

这是因为。注意,在Python3中,不会返回列表,因此我们必须强制它

我不知道如何在飞行中重新编码

这是因为:
1 if row[i]>0 else 0
。一般形式
A if cond else B
根据条件计算为
A
B

另一种形式,我认为是
content=list((第[I]行和第1行)代表included\u cols中的I)
。这是因为始终返回一个或另一个输入。

这应该可以:

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)

与上面的答案一样,这似乎将整行代码重新编码为“1”。我只是想将单个单元格重新编码为“1”。这不应该包括在
中吗?\u cols=[5]+range(82844)
,因为第一列位于列表中的索引0处?与其他代码一样,这似乎将整行重新编码为“1”。我想将单个单元格重新编码为“1”。行中的项是否已转换为整数,或者它们只是表示数字的字符串?如果它们是字符串,我将转换添加到int。如果不进行转换,字符串与0的比较将始终计算为false。这不应该是
包含的吗\u cols=[5]+range(82844)
,因为第一列位于列表中的索引0处?@user2676699是的,您是正确的。这似乎起了作用,但我必须删除标题,否则它也会尝试测试。如何首先写入头,但在测试时跳过它?而且,我意识到我只想写第5列,而不想转换它。“我该怎么做?”马特在循环外读写标题。如果这不合理,问一个新的问题,我可以用我刚写的代码来回答这个问题
content = list((1 if row[i] > 0 else 0) for i in included_cols)
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)