Я совершенно новичок в Python, и когда я использую gzip.open()
для работы с файлом .gz, я получаю несколько кодов, таких как "It’s one of those great ensemble casts that’s incredibly balanced"
.
Как я могу справиться с этим? Код, который я использую:
def _review_reader(file_path):
gz = gzip.open(file_path)
for l in gz:
yield eval(l)
файл сжат из файла JSON
лайк:
{"reviewerID": "A11N155CW1UV02", "asin": "B000H00VBQ", "reviewerName": "AdrianaM", "helpful": [0, 0], "reviewText": "I had big expectations because I love English TV, in particular Investigative and detective stuff but this guy is really boring. It didn\'t appeal to me at all.", "overall": 2.0, "summary": "A little bit boring for me", "unixReviewTime": 1399075200, "reviewTime": "05 3, 2014"}\n
{"reviewerID": "A3BC8O2KCL29V2", "asin": "B000H00VBQ", "reviewerName": "Carol T", "helpful": [0, 0], "reviewText": "I highly recommend this series. It is a must for anyone who is yearning to watch \\"grown up\\" television. Complex characters and plots to keep one totally involved. Thank you Amazin Prime.", "overall": 5.0, "summary": "Excellent Grown Up TV", "unixReviewTime": 1346630400, "reviewTime": "09 3, 2012"}\n
....
и я хочу получить текст обзора, но есть код, подобный ’
Поскольку вы смотрите на данные JSON, используйте для их загрузки анализатор Python JSON. Он будет автоматически обрабатывать любые встроенные экранированные символы, такие как \n
или \"
.
При чтении из файла gzip важно понимать, что gzip дает вам необработанные байты. Эти байты должны быть явно настроены на текст путем вызова .decode()
, и для того, чтобы сделать это правильно, вам нужно знать, какая кодировка текста использовалась для JSON. UTF-8 - довольно безопасное предположение по умолчанию, но это может быть что-то другое, в зависимости от того, что было выбрано при записи файла .gz.
После анализа JSON вы можете получить доступ к свойствам по их имени:
import json
import gzip
def _review_reader(file_path, encoding="utf8"):
with gzip.open(file_path, "rb") as f:
json_text = f.read().decode(encoding)
return json.loads(json_text)
for review in _review_reader(file_path):
print(review['reviewText'])
Если reviewText
содержит HTML-код вместо обычного текста, может потребоваться еще один шаг - синтаксический анализ HTML. Модуль lxml
может помочь:
from lxml import etree
# ...
for review in _review_reader(file_path):
text = review['reviewText']
tree = etree.fromstring("<html>" + text + "</html>")
print(tree.text)
eval(l)
? Вы должны быть очень осторожны при использовании этой функции вообще, и это почти наверняка неправильно в этой ситуации. Используйтеyield l
или, что еще лучше, замените весь циклfor
наyield from gz
.