#python
Вопрос:
У меня есть этот файл TSV:
kind 10
men 9
number 8
animated 7
blade 6
jolly 5
manage 4
move 3
complete 2
meat 1
И я хотел бы удалить все слова, в которых рядом с ними меньше цифры 5.
Так что только :
Output:
kind 10
men 9
number 8
animated 7
blade 6
jolly 5
Я хотел бы сделать это в виде кода на python. Я подумал, может быть, я мог бы загрузить его в список и оттуда посмотреть на номер, и если он меньше 5, он удаляется. Но как это сделать, я не уверен.
Что-то вроде этого:
new_file = open(the_file,encoding="utf-8")
data = new_file.readlines()
new_list = []
for values in data:
if values > 5:
new_list.append(values)
Комментарии:
1. вам следует рассмотреть возможность использования csv.reader() для анализа (c/t)sv-файлов, для использования в формате tsv:
csv.reader(new_file, delimiter="t")
. Если вы не уверены, как действовать, всегда полезноprint()
посмотреть, какое значение имеет переменная, с которой вы имеете дело. Тогда вы могли бы увидеть, что у вас там есть список вместо номера.
Ответ №1:
Добро пожаловать в сообщество. Как и предполагали другие, вы вполне можете использовать панд. Если вы хотите использовать модуль csv, вы можете сделать что-то вроде следующего:
import csv
tsv_file = open("example.tsv")
read_tsv = list(csv.reader(tsv_file, delimiter="t"))
for row in read_tsv:
if float(row[1]) < 5:
read_tsv.remove(row)
Это считывает файл в список списков, каждая строка которого представляет собой один список. Если значение всегда будет вторым, вы можете прочитать его так и исключить строку из большего списка. Надеюсь, это помогло!
ПРАВКА: Извините, я только что видел ваш комментарий. Попробуйте что-нибудь еще, подобное тому, что я отредактировал в этом посте (я сделал пару предположений о читателе CSV, которые были ошибочными, но я думаю, что теперь это исправлено. Надеюсь, это сработает.
Комментарии:
1. Здравствуйте, я пробовал этот метод, но когда я печатаю файл, он выдает мне «AttributeError: объект ‘_csv.reader’ не имеет атрибута ‘drop'».
2. Может быть, мне нужно импортировать что-то, кроме csv, чтобы использовать атрибут drop
3. Отредактировано! Извините за столь поздний час.
Ответ №2:
Если вы просматриваете такого рода файлы, я бы действительно посмотрел на Панд. Это в основном преуспевает на стероидах.
Код будет выглядеть более или менее так:
df = pd.read_csv('file.tsv', sep='t')
df = df.loc[4 < df['column_name']]
Комментарии:
1. разве Панды не перебор для чего-то, с чем можно справиться с помощью встроенного
csv
модуля?2. В некотором смысле, да. Но если TS заинтересован в работе с такого рода данными и Python, это просто так мощно. И документация и доступные ресурсы великолепны. Я, конечно, не могу сказать, какова конечная цель TS, я вижу, что вы также предложили модуль csv, так что давайте посмотрим, куда он или она хочет его взять 🙂
3. Будьте осторожны, Панды-это не Питон. Это большая платформа, поддерживаемая Python, но имеющая совершенно иную семантику. Для любого стандартного объекта Python
a
, послеb = a
,b == a
является логическимTrue
значением . Так что вы можете смело это делатьif b == a: # do_something
. Но не с предметами Панд…4. Конечно, это мощно, но, учитывая, что OP борется с базовой фильтрацией данных (это не значит, что это преступление, все начинают в какой-то момент), я не думаю, что они готовы к тому, чтобы их бросили в глубокую воду Панд.
Ответ №3:
Сначала вы должны прочитать в файле. Это даст вам список с каждой строкой из файла:
with open('test.txt', 'rt') as file:
content = file.readlines()
Теперь достаточно проверить целое число, составленное из последних цифр каждой строки (после удаления символа новой строки). Сравните его с 5, а затем запишите обратно в файл, вот так:
with open('test.txt', 'wt') as file:
file.writelines([c for c in content if int(c.strip()[-2:]) >= 5])
Комментарии:
1. Я тоже попробовал это, однако это ничего не меняет в моем файле tsv, осталось все то же количество точек данных.
2. Вы
test.txt
заменили его своим файлом?3. Да, я сделал это, фактический файл, который я хочу запустить, содержит 55 804 точки данных, но все это tsv. После запуска кода я использую оператор len, чтобы увидеть длину файла, и он по-прежнему составляет 55 804.
4. Хм, это отлично сработало для меня с вашим примером tsv-файла. У вас есть только эти две колонки, верно?
5. Да, только эти две колонки, одна для слова, а другая для числа. Сначала его слово, а затем рядом со словом-число, разделенное вкладкой между ними.