Как работать с кавычками в кавычках в файлах CSV? - PullRequest
0 голосов
/ 01 апреля 2019

Я создаю скребок для твиттера в python, который я хотел бы очистить домашнюю временную шкалу и создать читаемый CSV-файл с идентификатором твита, создателем твита, временной меткой и контентом твита.Твиты часто содержат запятые (разделитель, который я использую), что не является проблемой, когда столбец содержимого твита заключен в одинарные кавычки (цитата, которую я использую).Тем не менее, из-за ограничений API Twitter, некоторые твиты содержат одинарные кавычки и запятые, что приводит к тому, что читатель CSV воспринимает запятые в твитах как разделители.

Я пытался использовать регулярные выражения для удаления или замены одинарных кавычек внутри фактических символов в кавычках, которые я хотел бы сохранить, но я не нашел способа сделать это.

Вот как выглядит tweets.txt:

ID,Creator,Timestamp,Tweet
1112783967302844417,twitteruser,Mon Apr 01 18:29:06 +0000 2019,'At Adobe's summit, 'experience' was everywhere'

Вот мой скрипт на python:

import csv

with open ('tweets.txt','r') as csv_file:
    csv_reader = csv.reader(csv_file, delimiter = ',', quotechar="'")
    for line in csv_reader:
        print(line)

Я хотел бы получить вывод, подобный этому:

['ID', 'Creator', 'Timestamp', 'Tweet']
['1112783967302844417', 'twitteruser', 'Mon Apr 01 18:29:06 +0000 2019', 'At Adobe^s summit, ^experience^ was everywhere']

Но в настоящее время тот факт, что содержимое твита содержит одинарные кавычки, делает его таким, что программа чтения CSV распознает запятые как разделители и выдает следующее:

['ID', 'Creator', 'Timestamp', 'Tweet']
['1112783967302844417', 'twitteruser', 'Mon Apr 01 18:29:06 +0000 2019', 'At Adobes summit', " 'experience' was everywhere'"]

Ответы [ 3 ]

0 голосов
/ 01 апреля 2019

Поскольку у вас нестандартный формат ввода, вы должны использовать свой собственный анализатор. Например, вы можете использовать простой RegEx для анализа записей.

Например, RegEx "([^,]+),([^,]+),([^,]+),'?(.*?)'?$" может анализировать заголовок и твиты. Твит можно цитировать или нет.

Вот код:

import re

match_record = re.compile(r"([^,]+),([^,]+),([^,]+),'?(.*?)'?$").match

with open('tweets.txt', mode='r', encoding="utf-8") as csv_file:
    for line in csv_file:
        line = line.strip()
        mo = match_record(line)
        record = mo.groups()
        print(record)

Не забудьте указать кодировку файла (я предположил, что это «utf-8»)…

0 голосов
/ 01 апреля 2019

В этом случае, когда вам известно количество столбцов в вашем CSV и где только последний является свободным текстом, содержащим запятые, вы можете использовать строковые методы Python:

with open ('tweets.txt','r') as file:
    for line in file:
        l = (line.strip()                  # Get rid of newlines
                 .split(",", 3))           # Get four columns
        l[-1] = (l[-1].strip("'")          # Remove flanking single quotes
                      .replace("'", "^"))  # Replace inner single quotes if required
        print(l)

В этом коде столько ограничений, и он будет соответствовать только вашему текущему случаю.

0 голосов
/ 01 апреля 2019

Решение использует регулярное выражение. Это не лучшее решение, но это начало. Я думаю, что есть несколько других вариантов, которые могут быть предприняты, чтобы избежать этой проблемы, например, запись этих записей в базу данных. Или при записи в файл, правильно экранируя кавычки.

import re

line_pattern = r'([^,]*),([^,]*),([^,]*),(.*)'

with open ('tweets.txt','r') as csv_file:
    for line in csv_file.readlines():

        match_obj = re.match(line_pattern, line)

        id_ = match_obj.group(1)
        creator = match_obj.group(2)
        timestamp = match_obj.group(3)
        tweet = match_obj.group(4).strip("'")  # clean quotes off ends

        print([id_, creator, timestamp, tweet])

Обратите внимание, что это решение не является гибким в любом случае. Это также работает, только если первые три столбца не имеют запятых. Но, как я уже сказал, перед тем, как перейти к этой точке, необходимо внести улучшения, которые позволят избежать этой проблемы с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...