2016-03-28 3 views
1

У меня есть два файла .csv, связанный с данными из Twitter. У одного есть текст твитов, у другого - идентификаторы этих твитов. Файл с идентификаторами - это совокупность, из которой отбираются твиты в другом файле. Я пытаюсь написать сценарий для чтения текста, поиска другого файла для соответствующего идентификатора, а затем написать новый файл .csv, в котором есть как идентификатор, так и текст для твитов в меньшем экземпляре.Работа с CSV: чтение и запись данных в правильном порядке

Вот что я до сих пор:

import csv 

# creates empty dictionary in which to store tweetIDs and tweet text 
originals_data = {} 

# declares an empty list to hold tweet text from coded datafile 
# will be used to compare against the dictionary created earlier 
coded_data = [] 
coded_all = [] # for all, not just text 

# list to hold the IDs belonging to coded tweets for the round 
tweet_IDs_for_coded = [] 

with open('first20.csv', 'rt') as round_in, open('gg_originals.csv', 'rt') as original_in: 

    # reader object for gg_originals 
    readOrigin = csv.reader(original_in, delimiter=',') 
    # adds values from .csv file into the dictionary 
    for row in readOrigin: 
     originals_data[row[0]] = row[1] 

    # reader object for round_x data 
    readRound = csv.reader(round_in, delimiter=",") 
    # appends the tweet text to a list 
    for row in readRound: 
     coded_data.append(row[0]) 

    # iterates over id:text dictionary 
    for tweet_id in originals_data: 
     # iterates over coded_data 
     for tweet in coded_data: 
      # When tweet in list matches text in dict, sends key to list 
      if tweet == originals_data[tweet_id]: 
       tweet_IDs_for_coded.append(tweet_id) 

with open('first20.csv', 'rt') as round_in, open('test2.csv', 'wt') as output: 
    # reader object for round_x data 
    readRound = csv.reader(round_in, delimiter=",") 
    # creates writer object to write new csv file with IDs 
    writeNew = csv.writer(output, delimiter=",") 
    # list that holds everything that's going into the csv file 
    everything = [] 
    # sets row to equal a single row from round data 
    row = next(readRound) 
    row.insert(0, 'ID') 
    # appends ID and then all existing data to list of rows 
    everything.append(row) 
    for i, row in enumerate(readRound): 
     everything.append([str(tweet_IDs_for_coded[i])] + row) 
    writeNew.writerows(everything) 

Данные для файла населения (gg_originals.csv) выглядит примерно так:

tweet_id_str,text 
534974890168700930,abcd 
534267820071084033,abce 
539572102441877504,abcf 
539973576108294145,abcg 
529278820876943361,abch 
529583601244176384,abci 
535172191743397888,abcj 
532195210059874304,abck 
537812033895669760,abcl 
, 
, 

Текстовый только файл, который является подмножеством населения будет выглядеть так:

text 
abcl 
abci 
abcd 

Что я до сих пор работает, похоже, rrect IDs, и даже записывает их в новый столбец в новом файле .csv. Однако идентификаторы в новом файле находятся не в правильных строках - они отображаются в строках для текста, который им фактически не соответствует, что плохо!

Новый файл должен выглядеть примерно так:

ID,text 
537812033895669760,abcl 
529583601244176384,abci 
534974890168700930,abcd 

Вместо этого, он заканчивает так:

ID,text 
529583601244176384,abcl 
537812033895669760,abci 
534974890168700930,abcd 

правильные идентификаторы были расположены, но они были написаны к неправильным строкам.

+0

Просьба также разместить образец данных. (из обоих файлов) – Saleem

+0

Было бы полезно включить примеры ввода, то, что вы * на самом деле получаете в качестве вывода и что вы ожидаете *. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). И добро пожаловать в StackOverflow! –

+0

Я думаю, что вы плохо злоупотребляете своим словарем, но образец данных будет полезен. Вам нужно только перебирать 'coded_data', а затем делать' tweet_IDs_for_coded.append (coded_data [tweet]) 'на каждой итерации (возможно, каким-то образом обрабатывать исключение, если оно не найдено в словаре). Но я думаю, что вам нужен твит, как диктофон, а не идентификатор? Для получения дополнительной помощи потребуются примеры данных. – roganjosh

ответ

1

Хорошо, этот код делает (я думаю), что вы искали. Причина, по которой я попросил вашу ОС, - это то, что wt предоставит двунаправленные csvs в Windows, поэтому мне пришлось использовать wb. Кроме того, вставка идентификатора «верхнего регистра» в ячейке A1 вызывает проблемы типа при открытии с помощью Excel. Все весело :)

У меня закончилось время, чтобы отследить вашу ошибку и все еще дать ответ, поэтому я написал ответ, и я вернусь, если у меня появятся шансы и выделите, где ваша работа вышла из- sync (я никогда не сталкивался с ошибкой SYLK в Excel раньше, чем отвлекался!).

Я поменял ваш словарь вокруг. Сам твит стал ключом к диктову. Словарь больше не повторяется. Это также означает, что вам нужно только открыть first20.csv один раз. Ваш оригинальный подход немного запутан.

import csv 

with open('gg_originals.csv', 'rt') as original_in: 
    readOrigin = csv.reader(original_in, delimiter = ',') 
    originals_data = {row[1]: row[0] for row in readOrigin} 

with open('first20.csv', 'rt') as round_in: 
    input_data = csv.reader(round_in) 
    data_to_match = [row[0] for row in input_data] 

compiled_list = [] 
for item in data_to_match: 
    compiled_list.append([item, originals_data[item]]) 

with open('testoutput.csv', 'wt') as outfile: 
    writer = csv.writer(outfile) 
    writer.writerows(compiled_list) 
+0

Я получаю следующее беспорядок, когда я запускаю это: (строка 26) 'KeyError: 'Input.tweet'' Input.tweet - это заголовок первой строки файла. Когда я удаляю строку с заголовками, я получаю другую ошибку: (строка 30) 'TypeError: необходим байтоподобный объект, а не 'str'' – jguberman

+0

Строка 26 и строка 30 являются пустыми в сценарии, который я привел выше (Я все еще открываю его в своем редакторе), поэтому я не могу отлаживать это. Вы скопировали мой код с 'import csv' в качестве первой строки? – roganjosh

+0

'Input.tweet' не является заголовком в ваших файлах примеров. Это работает, используя примеры, которые вы указали, которые я преобразовал в CSV. – roganjosh

Смежные вопросы