2016-01-28 2 views
0

Предупреждение: я очень новичок в Python и в программировании в целом. Я пытаюсь использовать Python 3, чтобы получить некоторые CSV-данные и внести некоторые изменения в него, прежде чем записывать их в файл. Моя проблема заключается в доступе к данным CSV из переменной, например, так:Редактирование загруженного CSV в памяти перед записью

import csv 
import requests 

csvfile = session.get(url) 
reader = csv.reader(csvfile.content) 

for row in reader: 
    do(something) 

Это возвращает:

_csv.Error: iterator should return strings, not int (did you open the file in text mode?) 

Googling показал, что я должен кормить текст читателя вместо байт, поэтому я попытался :

reader = csv.reader(csvfile.text) 

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

csvfile = session.get(url) 

with open("temp.txt", 'wb') as f: 
    f.write(csvfile.content) 

with open("temp.txt", 'rU', encoding="utf8") as data: 
    reader = csv.reader(data) 
    for row in reader: 
     do(something) 

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

+0

[Это] (https://newcircle.com/s/post/1572/python_for_beginners_reading_and_manipulating_csv_files), вероятно, стоит посмотреть, поскольку вы только начинаете. – brittenb

+0

Какой формат - данные, которые вы извлекаете из URL-адреса (xml, json и т. Д.). – jmugz3

+0

Это должен быть открытый текст, но, скорее всего, я что-то упускаю или что-то недопонимаю. Соответствующие заголовки ответов таковы: Content-Disposition: «attachment; filename = data.csv» Content-Encoding: «gzip» Content-Type: «text/csv; charset = UTF-8» – JSantos

ответ

0

вам не придется писать временный файл, вот что я хотел бы сделать, используя «CSV» и «просит» модули:

import csv 
import requests 

__csvfilepathname__ = r'c:\test\test.csv' 
__url__ = 'https://server.domain.com/test.csv' 

def csv_reader(filename, enc = 'utf_8'): 
    with open(filename, 'r', encoding = enc) as openfileobject: 
     reader = csv.reader(openfileobject) 
     for row in reader: 
      #do something 
      print(row) 
    return 

def csv_from_url(url): 
    line = '' 
    datalist = [] 
    s = requests.Session() 
    r = s.get(url)  
    for x in r.text.replace('\r',''): 
     if not x[0] == '\n': 
      line = line + str(x[0]) 
     else: 
      datalist.append(line) 
      line = '' 
    datalist.append(line) 
    # at this point you already have a data list 'datalist' 
    # no need really to use the csv.reader object, but here goes: 
    reader = csv.reader(datalist) 
    for row in reader: 
     #do something 
     print(row) 
    return 

def main(): 
    csv_reader(__csvfilepathname__) 
    csv_from_url(__url__) 
    return 

if __name__ == '__main__': 
    main() 

не очень красиво, и, вероятно, не очень хорошо в отношении памяти/производительности, в зависимости от того, насколько «большой» ваш csv/data

HTH, Edwin.

+0

Спасибо. Это дает ряд заголовков правильно, но после этого я бегу в это: UnicodeEncodeError: «CharMap» кодек не может кодировать символ «\ u03c2» в позиции 12303: символ сопоставляется Любые идеи? – JSantos

+0

@JSantos, который выглядит для меня как двухбайтовое кодирование, поэтому вам придется выяснить, что кодирует ваш источник. utf_16_be или utf_16_le или некоторая другая кодировка (их много!) ... как только вы знаете кодировку источника, вы можете преобразовать строку в строку Юникода, используя правильную кодировку. –

+0

Это был UTF8. Работая сейчас, спасибо! – JSantos