Я создаю код Python для фильтрации значений в CSV, но значения, которые я хочу сохранить, удаляются. Что мне не хватает? - PullRequest
0 голосов
/ 03 апреля 2020

Я работал с одним из моих советников над созданием кода python, который будет: 1. удалять первые 2 строки из csv, 2. удалять строки, содержащие значение «Margin of Error» в выходных данных и 3. удалите строки, в которых нет значения в столбце «Рабочие 16 и старше».

Формат CSV форматируется четырьмя столбцами в следующем порядке: «Место жительства», «Рабочее место», «Выходные данные», «Рабочие 16 и старше».

Мы смогли успешно выполнить все вышеперечисленные цели, ОДНАКО код удаляет строки, которые не содержат значений в столбцах «Рабочие 16» и «Старые», КАК ХОРОШО, как любое значение более 3 символов. Любое значение, равное 1000 или больше, фильтруется, и я не вижу, где это будет происходить в коде. Любая помощь или предложения?

Спасибо!

import csv
with open('wyoming.csv','r') as csv_file:
    Oneline = csv_file.readline()
    Oneline = csv_file.readline()
    with open('Nicole_out4.csv', 'w', newline='') as csv_out:
        mywriter = csv.writer(csv_out, quoting=csv.QUOTE_ALL)
        Oneline = csv_file.readline()
        Title_line = Oneline.split(',')
        Title_line[-1] = Title_line[-1][0:-1]
        print(Title_line)
        mywriter.writerow(Title_line)
        for Oneline in csv_file:
            testline = Oneline.split('"')
            test1 = len(testline)
            if test1 < 2:
                break
            for ea in testline:
                if len(ea) < 2:
                    testline.remove(ea)
                elif (ea[0]==','):
                    newea = ea[1:].split(',')
                    testline.remove(ea)
                    for eas in newea:
                        testline.append(eas)
                    if (testline[2] == 'Margin of Error') or (len(testline[3]) < 2):
                        break
                    else:
                        testline[-1] = testline[-1][0:-1]
                        mywriter.writerow(testline)
    csv_out.close()
csv_file.close()

1 Ответ

0 голосов
/ 03 апреля 2020

Не глядя слишком внимательно на ваш код, я чувствую, что вы делаете его более сложным, чем нужно - при этом, я не знаю, как выглядит ваш CSV-файл.

Я думаю, что это выглядит примерно так (data.csv):

Residence,Workplace,Output,Workers 16 and Older

Bob'sHome,Bob'sWork,abc,
Tom'sHome,Tom'sWork,xyz,100
Joe'sHome,Joe'sWork,foo,1000
Tim'sHome,Tim'sWork,Margin of Error,10

Где первая строка определяет имена полей столбцов, а вторая строка может быть пустой. В соответствии с вашими критериями фильтрации, только вторая и третья записи (Tom и Joe) могут пройти через фильтр, правильно?

Я предлагаю что-то вроде этого:

def main():

    from csv import DictReader

    with open("data.csv", "r") as file:
        reader = DictReader(file)
        for line in reader:
            if line["Output"] == "Margin of Error" or not line["Workers 16 and Older"]:
                continue
            print(line)

    return 0


if __name__ == "__main__":
    import sys
    sys.exit(main())

Вывод:

{'Residence': "Tom'sHome", 'Workplace': "Tom'sWork", 'Output': 'xyz', 'Workers 16 and Older': '100'}
{'Residence': "Joe'sHome", 'Workplace': "Joe'sWork", 'Output': 'foo', 'Workers 16 and Older': '1000'}
>>> 

Я немного удивлен, что вы не в полной мере используете модуль csv. Вместо того, чтобы использовать его для чтения и записи файлов CSV, вы используете его только для записи. Мне нравится работать с csv.DictReader с. Он обрабатывает пустые строки и потенциальные имена полей автоматически. Однако вместо печати отфильтрованных строк вы должны записать их в файл.

Не видя выдержки из вашего фактического файла CSV, трудно помочь больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...