* Обратите внимание, я новичок в Python ....

Я пытаюсь написать сценарий для большого файла CSV. Моя цель - найти (например, grep) во 2-м столбце CSV сложную фразу , содержащую строку , за которой следует специальный символ и затем целое , например "Mainbalance-7-0" или "Mainbalance-8-0"

Строка всегда "Mainbalance".

Специальные символы всегда "-".

Целое число изменится.

Если фраза найдена, я хочу вывести всю строку в новый файл csv .

Я просмотрел другие ответы здесь, но не могу найти подробностей.

Вход выглядит так:

БАЛ, 04, ПСМС-5-13,0, ВЕДРО, СЛОВО

BAL, 03, Mainbalance-6-0,36, MAIN, WORD

БАЛ, 020, PLUSC-122-0,36, ГЛАВНАЯ, СЛОВО

BAL, 05, Mainbalance-7-0,36, MAIN, WORD

Чтобы вывод был:

BAL, 03, Mainbalance-6-0,36, MAIN, WORD

BAL, 05, Mainbalance-7-0,36, MAIN, WORD

Я пробовал следующее ...

with open("D:/Temp/input.csv", 'rb') as f, open('D:/Temp/output.csv','wb') as outf:
    writer = csv.writer(outf, delimiter=',')
    reader = csv.reader(f)
    for line in f:
        if 'Mainbalance*' in line:
            writer.writerow(line)

С файлом, созданным без печати результатов.

0
pippy5 2 Янв 2018 в 06:41

2 ответа

Лучший ответ

Вы должны перебирать объект reader, как указал Стивен в комментариях, и проверять третий столбец каждой строки. Затем, если проверка значения столбца для начала с Mainbalance достаточно надежна, вы можете использовать str.startswith():

for line in reader:
    if line[2].startswith("Mainbalance"):
        writer.writerow(line)

Или, если требуется более подробная проверка, мы можем создать шаблон регулярного выражения, например Mainbalance-\d+-\d+, где \d+ будет соответствовать одной или нескольким цифрам:

import re

# ...

pattern = re.compile(r"Mainbalance-\d+-\d+")
for line in reader:
    if pattern.match(line[2]):
        writer.writerow(line)
0
alecxe 2 Янв 2018 в 03:49

Код не работает, поскольку Mainbalance * не является регулярным выражением.

if 'Mainbalance*' in line: # resolves to false, as * is not in the string.

Измените код, убрав звездочку , и тогда код заработает.

if 'Mainbalance' in line: # star is removed
0
user3808268 2 Янв 2018 в 03:46