#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 Вы можете проверить сейчас?