Python. CSV писатель - PullRequest
       15

Python. CSV писатель

2 голосов
/ 18 апреля 2011

Я использую метод .writer() в цикле, как показано в документации по Python.Я хочу записать результаты переменной u, строка за строкой (или лучше строка за строкой).

На самом деле она отлично работает в интерпретаторе, но модуль writerow(), похоже, не работает.Почему?

from urlparse import urlparse
import csv
import re

ifile =open(ipath,'r')
ofile = open(opath, 'wb')
writer = csv.writer(ofile, dialect='excel')

url =[urlparse(u).netloc for u in file (ipath, "r+b")]
sitesource =  set([re.sub("www.", "", e) for e in url])
liste = [re.split(",'", e) for e in liste]


ofile
for row in file (ifile) :
    for u in sitesource:
        print ("Creation de:", u)
        writer.writerow(u) 

ofile.close()

Я использую Python 2.7.

Ответы [ 4 ]

5 голосов
/ 18 апреля 2011

Гадание на вас действительно означает, я бы переписал ваш код следующим образом:

from urlparse import urlparse
import csv
import re

ifile =open(ipath,'r')
ofile = open(opath, 'wb')
writer = csv.writer(ofile, dialect='excel')

url =[urlparse(u).netloc for u in ifile]
sitesource =  set([re.sub("www.", "", e) for e in url])

for u in sitesource:
    print ("Creation de:", u)
    writer.writerow([u]) 

ofile.close()
ifile.close()

Я удалил liste, так как он не используется. Я избавился от for row in file (ifile):, так как вы уже перебирали его содержимое при создании url.

Я изменил

url =[urlparse(u).netloc for u in file (ipath, "r+b")]

до

url =[urlparse(u).netloc for u in ifile]

потому что файл уже открыт. Я предполагал, что вам не нужен двоичный режим, если вы читаете строки.

Я изменил writerow(u), чтобы написать последовательность: writerow([u]). Это ставит одну u на строку, что означает, что ваш CSV-файл не будет содержать запятые. Если вы хотите, чтобы все ваши результаты были в одном ряду, замените последний цикл на этот параметр writer.writerow(sitesource).

2 голосов
/ 18 апреля 2011

writerow() ожидает аргумент последовательности, поэтому я думаю, что вам нужно использовать writer.writerow([u]), поскольку каждый u представляет собой одну строку - в противном случае вы передаете ему последовательность символов, выполняя то, что вы в данный момент имеете .

0 голосов
/ 18 апреля 2011

Не совсем уверен, но csv.writer.writerow хочет последовательность (я всегда использую ее со списками) с полями для всей строки, и вы перебираете набор того, что возвращает то, что в вас?

0 голосов
/ 18 апреля 2011

Вы пытаетесь написать строку "u"? или содержимое переменной? Если это последний вариант, удалите скобки.

...