python从命令行读取csv文件并将输出写入output.csv

问题描述:

我是python的新手,正在尝试读取csv输入和输出文件,按每行扫描输入文件,并仅将那些行写入输出没有任何特殊字符的文件,如'?'或'0'。以下是我的代码:python从命令行读取csv文件并将输出写入output.csv

import csv 
import sys 
class PreProcessDataSet: 
    def preProcessData(self) : 
     print ('Enter the input path of the file : ') 
     inputFile = open(sys.argv[1], 'rb') 
     outputFile = open(sys.argv[2],'wb') 
     writer = csv.writer(outputFile) 
     i = 0 
     for row in csv.reader(inputFile): 
      if (row[i]!="0" or row[i] != "?"): 
       writer.writerow(row) 
       i=i+1 
       print row 

此代码不会给出任何输出。有人能帮我解决吗?

+0

您在此处定义一个类。也许你不是故意的,但我没有看到实际的电话。你错过了吗?如果不是,你可以分享吗?此外,有点奇怪,像这样调用sys.argv [1]。你是否想要从控制台读取它? –

您的状态if (row[i]!="0" or row[i] != "?"):始终为真。假设它是0,那么它肯定不是?所以or条件之一总是通过。这段代码应该打印行,直到出现其他原因崩溃(见下文)。所以,我认为你的第一个问题是你实际上没有调用这个方法。

接下来,您每行增加一列索引器i一次,因此它将读取第一行的单元格0,第二行的单元格1 ......并且最终当i变大时,您将收到索引错误比列的数量。它并没有真正做到你想要的,它只检查每行一个单元。

您可以使用set交集来确定受限字符是否在任何单元格中。我不清楚单元格是否必须完全等于其中一个限制字符,所以我编写了这个示例,通过将行连接到单个字符串进行检查来查找行中的任何事件。

import csv 
import sys 

class PreProcessDataSet: 
    def preProcessData(self) : 
     special_chars = set('?0') 
     # Don't tease the user with prompts that don't work! 
     # print ('Enter the input path of the file : ') 
     inputFile = open(sys.argv[1], 'rb') 
     outputFile = open(sys.argv[2],'wb') 
     print "Converting", inputFile, "to", outputFile 
     writer = csv.writer(outputFile) 
     for row in csv.reader(inputFile): 
      if not set(''.join(row)) & special_chars: 
       writer.writerow(row) 
       print row 


obj = PreProcessDataSet() 
obj.preProcessData() 

样品运行:

~/tmp $ cat infile.csv 
one,two,three 
0,four,five 
six?,seven,eight 
nine,ten,eleven 
~/tmp $ python test.py infile.csv outfile.csv 
Converting <open file 'infile.csv', mode 'rb' at 0x7f9d4d0165d0> to <open file 'outfile.csv', mode 'wb' at 0x7f9d4d016660> 
['one', 'two', 'three'] 
['nine', 'ten', 'eleven'] 
~/tmp $ cat outfile.csv 
one,two,three 
nine,ten,eleven 
+0

谢谢你的回答。还有限制字符0或?如果不存在,则不应写入输出文件。而且,这段代码并不真正写入输出文件。你能帮我解决吗? – user6622569

+0

它适合我。你打印('输入文件的输入路径''),然后从'sys.argv'中获取你的文件名。也许这些文件不会在你认为他们应该做的地方。我会用更多的印刷品来更新这个例子。 – tdelaney

+0

非常感谢。这有帮助! – user6622569