Python записывает в csv-файл из Dict

#python #python-3.x #csv #jupyter-notebook #character-encoding

#python #python-3.x #csv #jupyter-записная книжка #кодировка символов

Вопрос:

См. Файл Excel SS Данные выглядят как на изображении в csv-файле

  1. Это то, что я написал до сих пор, чтобы проанализировать обзоры из IMDB. Сначала он извлекает обзоры с веб-сайта imdb (250 лучших фильмов).
  2. Затем извлекает ссылки на фильмы, просматривает ссылки, извлекает текст из обзоров и сохраняет его в формате данных словаря с movie_name: формат обзора фильма.
  3. На последнем шаге я могу распечатать Movie_Name: обзор фильма на консоли. Но когда я записываю в CSV-файл, он выдает либо ошибки, либо записывает просто неправильные данные в CSV-файл.
 import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import ssl
import csv
import requests
import re
import nltk
from nltk.corpus import stopwords
nltk.download('stopwords')
nltk.download('punkt')
from nltk.tokenize import word_tokenize

# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}


url = input('Enter - ')
while (True):
    try:
        page = requests.get(url, headers = headers)
        soup = BeautifulSoup(page.content, "html.parser")
        container = soup.find_all('td', class_ = 'titleColumn')
        break
    except:
        print("Please enter a valid url:")
        url = input('Enter - ')

def movies_list():
    movie_names = []
    movies = container[:100] #here we get the top 50 movies we want
    for movie in movies:
        name = movie.find('a').text
        movie_names.append(name)
    return movie_names
#print(movie_names)


def movie_links_list():
    movie_links = []
    movies = container[:100]
    for movie in movies:
        tag = movie.find('a')`enter code here`
        link = tag.get('href', None)
        movie_links.append(link)
    for i in range(len(movie_links)):
            movie_links[i] = 'https://www.imdb.com/'  movie_links[i]
    return movie_links

def review_link_list(movie_links):
    review_links = []
    for movie_link in movie_links:
        title_pos = movie_link.find('title')
        nxt_slash = movie_link.find('/', title_pos)
        nxt2_slash = movie_link.find('/', nxt_slash 1)
        review_link = movie_link[:title_pos-1]   movie_link[title_pos:nxt2_slash 1]   "reviews?ref_=tt_urv"
        review_links.append(review_link)
    return review_links


def get_reviews(review_links):
    movie_names=movies_list()
    review_dict={}
    for i in range(len(review_links)):
        movie_name=movie_names[i]
        movie_reviews=[]
        review_page = requests.get(review_links[i], headers = headers)
        soup = BeautifulSoup(review_page.content, "html.parser")
        tag = soup.find_all('div', class_ = 'content') #find_all to return a list
        top_50= tag[:50]
        for j in top_50:
            try:
                review=j.select('div.show-more__control')[0].text
            except:
                continue
            movie_reviews.append(review)
        review_dict[movie_name]=movie_reviews
    return review_dict

file= "abc.csv"
with open(file ,'w') as csvfile:
    for i in range(len(movies)):
        csvwriter = csv.writer(csvfile)
        Name=movies[i]
        Review = reviews_dict[Name]
        try:
            csvwriter.writerow(Review)
        except:
            csvwriter.writerow("Review does not exist")
 

Комментарии:

1. Какую ошибку вы получили? На данный момент попробуйте отредактировать эту часть csv.writer(csvfile) csv.writer(csvfile,delimiter=',') и посмотреть, сработает ли это.

2. В этом acse он выдает ошибку типа: ‘delimeter’ является недопустимым аргументом ключевого слова для этой функции

Ответ №1:

вам нужно открыть файл и записать список с данными

 import csv
dict = {"mykey":10}

with open("mydata.csv", 'a') as file:
   writer = csv.writer(file)
   for key, value in dict.items():
     data = [key, value]
     writer.writerow(data)

 

в csv-файле «mydata.csv» вы не получите

 mykey,10
 

При использовании ‘a’ в качестве аргументов в open вы можете добавлять данные в файл, чтобы не перезаписывать старые данные

Комментарии:

1. Этот метод работает с несколькими входами. Но в моих данных len(dict) равно 100, dict.key = movie_name, а значение dict — это список из 25 отзывов об этом фильме. итак, всего 100 списков, содержащих около 1 миллиона слов. Запись этих данных приводит к потере данных и ненужным переводам строк