Я пытаюсь создать новый файл, содержащий только данные для фильмов с рангом выше 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))
но к сожалению не работает, что делать?
Некоторые примечания: csv_writer.writerow(dict(current_row))
не нуждается в обертке dict()
(current_row
уже является dict
). Вы не прошли newline=''
при открытии входного файла (вы должны делать это последовательно); режим по умолчанию равен 'r'
(где t
подразумевается), поэтому вы можете полностью опустить этот аргумент из первого open
. Кроме того, просто для ясности, я предполагаю, что ваш ввод находится в формате Excel, разделенном вкладками; вы можете выбрать именно этот диалект с помощью dialect='excel-tab'
; прохождение только delimiter='\t'
не дает понять, что вы точно соответствуете формату Excel.
Кроме того, чтобы внести ясность, я не вижу файлов данных, точно соответствующих вашему формату, на Сайт интерфейсов IMDB. Вы уверены, что заголовки столбцов точно соответствуют вашим ожиданиям?
ссылка: dropbox.com/s/65y4pi9o0kczz98/IMDB.txt?dl=0
я просто хочу создать новый файл, содержащий только данные для фильмов с рангом выше 9. ошибка, которую я получаю из своего кода: UnicodeEncodeError: кодек 'charmap' не может кодировать символ '\ u01e1' в позиции 6: сопоставление символов с <undefined>
Предположим, у вас есть следующее имя листа 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
Это файл text
, вы написали .csv
в заголовке.
Судя по ваш комментарий, кодировка вашей локали по умолчанию не поддерживает весь диапазон 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
на то, что имеет смысл для вашей ОС и варианта использования.
Что не работает? Предоставьте минимальный воспроизводимый пример, включая пример ввода (если он большой, укажите ссылку на файл IMDB, а также хотя бы несколько строк примера), ожидаемый вывод и фактический вывод.