python читает файл csv из командной строки и записывает вывод в output.csv

Я новичок в 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

Этот код не дает никакого вывода. Может кто-нибудь, пожалуйста, помогите мне с этим?


person user6622569    schedule 05.03.2017    source источник
comment
Здесь вы определяете класс. Может быть, вы не хотели этого, но я не вижу реального призыва к этому. Вам этого не хватает? Если нет, можете поделиться? Более того, как-то странно так называть sys.argv[1]. Вы хотели прочитать это из консоли?   -  person Shahar Bental    schedule 05.03.2017


Ответы (1)


Ваше условие 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
person tdelaney    schedule 05.03.2017
comment
Спасибо за этот ответ. Также запрещенные символы 0 или ? если он присутствует, не следует записывать в выходной файл. Кроме того, этот код на самом деле не записывает в выходной файл. Не могли бы вы мне помочь? - person user6622569; 05.03.2017
comment
Меня устраивает. Вы print ('Enter the input path of the file : '), но затем получаете имена файлов от sys.argv. Возможно, файлы просто идут не туда, куда, по вашему мнению, должны. Я обновлю пример с большим количеством отпечатков. - person tdelaney; 05.03.2017
comment
Большое спасибо. Это помогает! - person user6622569; 05.03.2017