2017-05-24 6 views
1

Ich erstelle eine Django App und ich muss mehrere *.csv Dateien importieren. One diese Datei hat folgende Struktur:Django CSV importieren mit Wagenrücklauf

id|value (header) 

12|¤this is the 

value¤ 

34|¤this is another 

value¤ 

ich diesen Code verwenden, um die Datei zu analysieren:

try: 
    csvfile = open(path, "r", encoding='utf-16') 
except IOError: 
    return False 
cursor.copy_from(csvfile , tblname, columns=['id', 'value'], sep='|') 

Aber wenn ich versuche, diese Datei zu analysieren, es gab mir diesen Fehler:

psycopg2.DataError: ERROR: missing data for the column "value" 

Gibt es eine Möglichkeit, diese Datei zu analysieren, die Wagenrücklauf innerhalb Textidentifikator ('¤') hält?

Antwort

0

Sie könnten Pythons csv Modul zum Lesen verwenden.

import csv 

try: 
    csvfile = open(path, newline='') 
except IOError: 
    return False 

csvreader = csv.reader(csvfile, delimiter='|', quotechar='¤') 
for row in csvreader: 
    print(', '.join(row)) # or do something else with the row of data. 
+0

Sie haben mehrere Möglichkeiten hier als Ich sehe es. Entweder benutze 'copy_expert' um Zeile für Zeile zu schreiben oder benutze die hier verwendete Methode http://bonesmoses.org/2014/07/25/friends-dont-let-friends-use-loops/ – hanshoi

+0

Nicht sehr elegant, aber ich erschaffe das : Versuch: csvfile = open (Pfad, newline = '') außer IOError: Falsch CSVReader = csv.reader zurückzukehren (csvfile, delimiter = '|', QuoteChar = '¤') für Zeile in CSVReader : cursor.execute (INSERT INTO "+ Tabellenname +" (ID, Wert) VALUES ('"+ Zeile [0] +' ','" + Zeile [1] + '') ") zumindest funktioniert es –

0

Ein Ansatz wäre es, die Einträge selbst bauen sich wie folgt zusammen:

blocks = [] 
block = [] 

with open('input.csv') as f_input: 
    for row in f_input: 
     if '|' in row: 
      if len(block): 
       blocks.append(''.join(block).strip('\n').split('|')) 
       block = [] 
      block.append(row) 
     else: 
      block.append(row) 

if len(block): 
    blocks.append(''.join(block).strip('\n').split('|')) 

print(blocks) 

Diese Liste Blöcke erzeugen würde, wie folgt:

[['id', 'value (header)'], ['12', '¤this is the\nvalue¤'], ['34', '¤this is another\nvalue¤']]