2016-11-11 4 views
0

Okay, ich habe eine CSV-Datei mit mehreren Zeilen (derzeit mehr als 40k). Aufgrund der großen Anzahl von Zeilen muss ich nacheinander lesen und eine Reihe von Operationen ausführen. Dies ist die erste Frage. Die zweite ist: Wie liest man die CSV-Datei und codiert sie in utf-8? Zweitens liest man die Datei in utf-8 nach dem Beispiel: csv documentation. Mesmo utilizando a classe class UTF8Recoder: oder zurück, kein Druck é \xe9 s\xf3. Könnte jemand mir helfen, dieses Problem zu lösen?Python - CSV-Reader - Lesen einer Zeile pro Zeit

import preprocessing 
import pymongo 
import csv,codecs,cStringIO 
from pymongo import MongoClient 
from unicodedata import normalize 
from preprocessing import PreProcessing 

class UTF8Recoder: 
    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 
    def __iter__(self): 
     return self 
    def next(self): 
     return self.reader.next().encode("utf-8") 

class UnicodeReader: 
    def __init__(self, f, dialect=csv.excel, encoding="utf-8-sig", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 
    def next(self): 
     '''next() -> unicode 
     This function reads and returns the next line as a Unicode string. 
     ''' 
     row = self.reader.next() 
     return [unicode(s, "utf-8") for s in row] 
    def __iter__(self): 
     return self 

with open('data/MyCSV.csv','rb') as csvfile: 
    reader = UnicodeReader(csvfile) 
    #writer = UnicodeWriter(fout,quoting=csv.QUOTE_ALL) 
    for row in reader: 
     print row 

def status_processing(corpus): 

    myCorpus = preprocessing.PreProcessing() 
    myCorpus.text = corpus 

    print "Starting..." 
    myCorpus.initial_processing() 
    print "Done." 
    print "----------------------------" 

Edit 1: Die Lösung von Mr. S Ringne funktioniert. Aber jetzt kann ich die Operationen in meinem def nicht tun. Hier ist der neue Code:

for csvfile in pd.read_csv('data/AracajuAgoraNoticias_facebook_statuses.csv',encoding='utf-8',sep=',', header='infer',engine='c', chunksize=2): 

    def status_processing(csvfile): 

     myCorpus = preprocessing.PreProcessing() 
     myCorpus.text = csvfile 

     print "Fazendo o processo inicial..." 
     myCorpus.initial_processing() 
     print "Feito." 
     print "----------------------------" 

Und am Ende des Skripts:

def main(): 
    status_processing(csvfile) 

main() 

Der Ausgang ist, wenn ich BeautifulSoup verwenden Links zu entfernen:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

Antwort

0

können Sie Ihre csv in Pandas speichern und weitere Operationen ausführen, die schneller wären.

import pandas as pd 
df = pd.read_csv('path_to_file.csv',encoding='utf-8',header = 'infer',engine = 'c') 
+0

Hmm, aber wie Zeile für Zeile gelesen? In diesem Fall lese ich eine Zeile, führe die Operationen in der 'def status_processing' aus und ich gehe zurück und lese eine andere Zeile. Der Prozess der Korrektur von Wörtern ist ziemlich teuer, um alle gleichzeitig zu lesen und die Operationen auszuführen. –

+0

@ LeandroS.Matos Verwenden Sie chunksize: für df in pd.read_csv ('matrix.txt', sep = ',', header = Keine, chunksize = 1): – Shubham

+0

@ LeandroS.Matos: http://Stackoverflow.com/ Fragen/29334463/pandas-read-csv-Datei-Zeile-für-Zeile – Shubham

0

Hier ist ein einfaches Muster Zeile für Zeile in UTF-8 lesen:

with open(filename, 'r', encoding="utf-8") as csvfile: 
    spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') 
    for row in spamreader: 
     # your operations go here 
Verwandte Themen