Как «сортировать файл csv» python

Я пытаюсь создать новый файл, содержащий только данные для фильмов с рангом выше 9.

Набор данных, который я анализирую, содержит оценки многих фильмов, полученные с IMDB. Поля данных:

  • Votes: количество людей, оценивших фильм
  • Rank: средний рейтинг фильма
  • Title: название фильма
  • Year: год выхода фильма

Код, который я пробовал:

import csv

filename = "IMDB.txt"
with open(filename, 'rt', encoding='utf-8-sig') as imdb_file:
    imdb_reader = csv.DictReader(imdb_file, delimiter = '\t')
    with open('new file.csv', 'w', newline='') as high_rank:
        fieldnames = ['Votes', 'Rank', 'Title', 'Year']
        writer = csv.DictWriter(high_rank, fieldnames=fieldnames)
        writer.writeheader()
        for line_number, current_row in enumerate (imdb_reader):
            if (float(current_row['Rank']) > 9.0):
                csv_writer.writerow(dict(current_row))

но к сожалению не работает, что делать?

Что не работает? Предоставьте минимальный воспроизводимый пример, включая пример ввода (если он большой, укажите ссылку на файл IMDB, а также хотя бы несколько строк примера), ожидаемый вывод и фактический вывод.

ShadowRanger 29.05.2019 19:48

Некоторые примечания: csv_writer.writerow(dict(current_row)) не нуждается в обертке dict() (current_row уже является dict). Вы не прошли newline='' при открытии входного файла (вы должны делать это последовательно); режим по умолчанию равен 'r' (где t подразумевается), поэтому вы можете полностью опустить этот аргумент из первого open. Кроме того, просто для ясности, я предполагаю, что ваш ввод находится в формате Excel, разделенном вкладками; вы можете выбрать именно этот диалект с помощью dialect='excel-tab'; прохождение только delimiter='\t' не дает понять, что вы точно соответствуете формату Excel.

ShadowRanger 29.05.2019 19:55

Кроме того, чтобы внести ясность, я не вижу файлов данных, точно соответствующих вашему формату, на Сайт интерфейсов IMDB. Вы уверены, что заголовки столбцов точно соответствуют вашим ожиданиям?

ShadowRanger 29.05.2019 19:57

ссылка: dropbox.com/s/65y4pi9o0kczz98/IMDB.txt?dl=0

king lebron 29.05.2019 19:59

я просто хочу создать новый файл, содержащий только данные для фильмов с рангом выше 9. ошибка, которую я получаю из своего кода: UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\ u01e1' в позиции 6: сопоставление символов с <undefined>

king lebron 29.05.2019 20:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
374
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Предположим, у вас есть следующее имя листа Excel temp.csv, и вы хотите отфильтровать фильмы с рейтингом выше 9 (включительно):

Один из простых способов — использовать модули pandas. Это дает вам возможность:

  • читать.csv файлы с pd.read_csv методом (док)
  • фильтр данные, как вы хотите
  • экспорт данные в новый файл: для .csv вывода df.to_csv выполнить задание (док)

Предположим, у вас есть следующий фрейм данных:

Код ниже выполняет задание:

# import modules
import pandas as pd

# Path - name of your file
filename = "temp.csv"

# Read the csv file
df = pd.read_csv(filename, sep = ";")
print(df)
#    Votes  Rank                               Film  Year
# 0     15    16          The Shawshank Redemption   1994
# 1   2004     5                     The Godfather   1972
# 2    486    13            The Godfather: Part II   1974
# 3    529     9  Il buono, il brutto, il cattivo.   1966
# 4    289    12                      Pulp Fiction   1994
# 5     98    11                         Inception   2010
# 6     69    18                  Schindler's List   1993
# 7      3     7                         Angry Men   1957
# 8    584    14   One Flew Over the Cuckoo's Nest   1975

# Filter the csv file
df_filtered = df[df["Rank"] >= 9]
print(df_filtered)
#    Votes  Rank                               Film  Year
# 0     15    16          The Shawshank Redemption   1994
# 2    486    13            The Godfather: Part II   1974
# 3    529     9  Il buono, il brutto, il cattivo.   1966
# 4    289    12                      Pulp Fiction   1994
# 5     98    11                         Inception   2010
# 6     69    18                  Schindler's List   1993
# 8    584    14   One Flew Over the Cuckoo's Nest   1975

# name new csv file
new_filename = filename[:-3] + "_new" + filename[-3:]

# Export dataframe to csv file
df_filtered.to_csv(new_filename)

Новый .csv выглядит так:

спасибо за помощь, но новый файл дал мне только 9 результатов, должно быть 18635 результатов, вы знаете, в чем проблема? это ссылка на файл: dropbox.com/s/65y4pi9o0kczz98/IMDB.txt?dl=0 я получаю сообщение об ошибке: ParserError: Ошибка токенизации данных. Ошибка C: ожидается 1 поле в строке 236, увидел 2

king lebron 29.05.2019 19:46

Это файл text, вы написали .csv в заголовке.

Alexandre B. 29.05.2019 23:53
Ответ принят как подходящий

Судя по ваш комментарий, кодировка вашей локали по умолчанию не поддерживает весь диапазон Unicode. Вам нужно указать кодировку для выходного файла, которая будет обрабатывать произвольные символы Unicode. Как правило, в системах, отличных от Windows, вы должны использовать 'utf-8'; в Windows вы можете использовать 'utf-16' или 'utf-8-sig' (программы Windows часто предполагают, что UTF-8 без явной подписи находится в кодировке локали, и неправильно ее интерпретируют). Исправить так же просто, как изменить:

with open('new file.csv', 'w', newline='') as high_rank:

к:

with open('new file.csv', 'w', encoding='utf-8', newline='') as high_rank:

изменение указанного encoding на то, что имеет смысл для вашей ОС и варианта использования.

Другие вопросы по теме