2015-03-17 2 views
1

У меня есть две проблемы:Python 3 - Чтение CSV файл с преобразованием типа

а) модуль Python CSV не может обрабатывать конкретный CSV файл правильно

У меня есть следующие данные в database.csv

"AAAAAAAA"  , 5.4817, 0.0000, 0.0000, 0.0000, 65.8370 
"n,m-BBBBBBBBB" , 1.7897, 675.3787, 1234.7865, 47.0000, 42.0070 

Обратите внимание, что между двойной кавычкой и запятой есть пробелы. Я использовал следующий сценарий для чтения файла, первый столбец будет декодироваться как "AAAAAAAA ", вместо "AAAAAAAA"

import csv 

def read_csv_data(path): 
    with open(path, 'rU') as f: 
    f_csv = csv.reader(f) 
    for row in f_csv: 
     yield row 

for row in read_csv_data('database.csv'): 
    print(row) 

Выход

['AAAAAAAA  ', ' 5.4817', ' 0.0000', ' 0.0000', ' 0.0000', ' 65.8370'] 
['n,m-BBBBBBBBB ', ' 1.7897', ' 675.3787', ' 1234.7865', ' 47.0000', ' 42.0070'] 

Чтобы удалить пробельные, я делаю это

import csv 

def read_csv_data(path): 
    col_type = [str, float, float, float, float, float] 
    with open(path, 'rU') as f: 
    f_csv = csv.reader(f) 
    for row in f_csv: 
     row = tuple(cast(val.strip()) for cast, val in zip(col_type, row)) 
     yield row 

for row in read_csv_data('database.csv'): 
    print(row) 

Выходной сигнал

('AAAAAAAA', 5.4817, 0.0, 0.0, 0.0, 65.8370) 
('n,m-BBBBBBBBB', 1.7897, 675.3787, 1234.7865, 47.0, 42.007) 

б) Использование namedtuple для чтения в данных CSV в память

С тем же CSV файл database.csv, я использую другой сценарий:

import csv 
from collections import namedtuple 

def read_csv_data(path): 
    col_type = [str, float, float, float, float, float] 
    Gas = namedtuple("Gas", ["gas", "sf", "h1", "h2", "h3", "m"]) 
    with open(path, 'rU') as f: 
    f_csv = csv.reader(f) 
    for row in f_csv: 
     row = list(cast(val.strip()) for cast, val in zip(col_type, row)) 
     for row2 in map(Gas._make, row): 
     yield row2 


    for row in read_csv_data('database.csv'): 
    print(row) 

Ошибка является

Traceback (most recent call last): 
    File "read_dict.py", line 17, in <module> 
    for row in read_csv_data('database.csv'): 
    File "read_dict.py", line 13, in read_csv_data 
    for row2 in map(Gas._make, row): 
    File "<string>", line 21, in _make 
TypeError: Expected 6 arguments, got 8 

ответ

3

Вместо

for row2 in map(Gas._make, row): 
    yield row2 

Вы просто хотите

yield Gas._make(row) 

Прямо сейчас вы цикл над каждым элементом в row и вызова Gas._make на него. Вот почему вы получаете «Ожидаемые 6 аргументов, получили 8» - вы пытаетесь сделать экземпляр Gas из "AAAAAAAA".

После изменения этого выход

Gas(gas='AAAAAAAA', sf=5.4817, h1=0.0, h2=0.0, h3=0.0, m=65.837) 
Gas(gas='n,m-BBBBBBBBB', sf=1.7897, h1=675.3787, h2=1234.7865, h3=47.0, m=42.007) 

PS: для Python 3, вы должны открыть файлы для использования с csv использованием newline="" см here.

+0

Это здорово !. Спасибо. – yoonghm

+0

Для проблемы а), я чувствую, что модуль csv не обрабатывает этот вид csv-файла. Я попробовал 'quoting = csv.QUOTE_NONNUMERIC' и' skipinitialspace = True'. – yoonghm

+0

Я импортирую файл csv 'database.csv' в Microsoft Excel, включая конечные пробелы. Это означало бы, что он считается действительным CSV-файлом. – yoonghm

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