我是python的新手,我正在尝试读取csv输入和输出文件,每行扫描输入文件,并只将那些行写入输出文件,这些行不具有任何特殊字符,如'?'或'0'。以下是我的代码:
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 :(得分:0)
您的条件if (row[i]!="0" or row[i] != "?"):
始终为真。假设它是0,那肯定不是吗?所以其中一个or
条件总是通过。此代码应该打印行,直到它因其他原因崩溃(见下文)。所以,我认为你的第一个问题是你实际上并没有调用这个方法。
接下来,您每行递增一次列索引器i
,因此它将读取第一行的单元格0,第二行的单元格1,...最终您将获得索引错误i
增长大于列数。它不是真正做你想要的,它每行只检查一个单元格。
您可以使用设置交叉点来查明任何单元格中是否存在受限制的字符。我不清楚单元格是否必须与受限制的字符完全相同,所以我写了这个例子,通过将行连接到一个字符串进行检查来查找行中的任何事件。
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