Как фильтровать csv-файлы на основе специальных символов?

#python #csv #for-loop #filter

#python #csv #для цикла #Фильтр

Вопрос:

У меня есть файл, который выглядит следующим образом:

 #test data
10  x   x   x
A11 2   x   x
*12 2   x   x
LOK 3   x   x
**r1    1   1   2
 Y6 x   x   x
13  x   x   x
 12 3   x   x
 

Я пытаюсь написать код, который захватывает row[0] , file1.txt если он содержит любой из следующих символов:

  1. Any numeric character (digit).
 2. Any character from the alphabet.
 3. An asterisk (*) or a plus ( ) sign.
 

Мой код прямо сейчас не дает правильного вывода, потому что я не знаю, как добавить требования 2 и 3.

Это мой код:

 import csv
old_path = 'file_1.txt'

def filter_row(row):
    if len(row) > 1 and row[1].isdigit():
        condition_1 = row[0].isdigit()

        return condition_1

with open(old_path, 'r') as f1:
    reader_f1 = csv.reader(f1, delimiter='t')

    for row in reader_f1:
        if filter_row(row):
            print(row)
 

Это результат, который я ожидаю:

    A11  2   x   x
    *12 2   x   x
    LOK 3   x   x
    **r1    1   1   2
     12 3   x   x
 

Ответ №1:

Предполагая, что вы используете Python3, всегда указывайте кодировку при открытии файла, например, ‘utf-8’ и newline =» Также может помочь диалект CSV,

 import csv


def check_aphabet(data):
    for ch in data:
        if((ch >= 'a' and ch <= 'z') or (ch >= 'A' and ch <= 'Z')):
            return True
    return False
def filter_row(row):
    data = row[0]
    if all([i.isdigit() for i in data]):
        return False
    elif check_aphabet(data) or all([i.isdigit() for i in data]):
        return True
    elif '*' in data or ' ' in data:
        return True
    return  False

with open('delete.csv', encoding='UTF-8', newline='') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter=',')
    for row in csv_reader:
        if filter_row(row):
            print(row)
 

Комментарии:

1. это все еще не дает мне желаемого результата

2. Каков разделитель вашего CSV-файла?

3. Я создал CSV-файл со значениями, разделенными запятыми: 0, x,x,x A11,2,x,x * 12,2,x,x LOK,3,x, x ** r1,1,1,2 Y6, x,x, x 13,x,x,x 12,3, x,x и выше код отлично работает с этим файлом.

4. У меня есть разделитель табуляции, вы просто печатаете строку [0], это не то, о чем я просил

5. @TangerCity Вы можете проверить сейчас?