Как удалить низкие значения из файла tsv

#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. Да, только эти две колонки, одна для слова, а другая для числа. Сначала его слово, а затем рядом со словом-число, разделенное вкладкой между ними.