2013-10-25 2 views
0

я ВГА список список с 2 строками и 1 целоеИмпорт CSV в виде списка списка в Python 3.3

list_of_ee = [["a","m",15],["w","p",34]] 

я экспортировать это в файл CSV, используя этот код.

import csv 

myfile = open("pppp.csv", 'wb') 
with open("pppp.csv", "w",newline='') as myfile: 
    wr = csv.writer(myfile, quoting=csv.QUOTE_NONE) 
    wr.writerows(list_of_ee) 

результат был

a m 15 
w p 34 

и я экспортировать, что с помощью этого кода

data = csv.reader(open('pppp.csv','r', newline='')) 
data = list(data) 
print(data) 

и результат был

[['a', 'm', '15'], ['w', 'p', '34']] 

, но я хочу, чтобы импортировать это приводит к такой же, как это было (как список списка a nd с 2 str и 1 целым числом) (при перезагрузке программы) в list_of_ee , и я хочу добавить их в list_of_ee (becoz, когда программа запустится, нет данных в list_of_ee.

+0

Возможный дубликат [Как экспортировать данные из csv в виде списка (python 3)] (http://stackoverflow.com/questions/19557611/how-to-export-data-from-csv-as-a- listpython-3) – kojiro

+1

Это может помочь: [Как преобразовать список элементов в их типы по умолчанию] (http: // stackoverflow.com/questions/18656498/how-to-convert-list-of-elements-to-their-default-types) –

+1

@kojiro ya у меня не получилось никаких хороших ответов от этого – user2912389

ответ

2

Если вы используете CSV, вы получаете строки. См. Документацию: http://docs.python.org/2/library/csv.html#module-contents

«Автоматическое преобразование типа данных не выполняется».

@hcwhsa указал на ответ, который показывает, как использовать ast.literal_eval(), чтобы угадать типы. Это не слишком сложно:

import ast 
import csv 

def convert_type(s): 
    try: 
     return ast.literal_eval(s) 
    except (ValueError, SyntaxError): 
     return s 

def convert_csv_row(lst): 
    return [convert_type(x) for x in lst] 

data = csv.reader(open('pppp.csv','r', newline='')) 
converted = [convert_csv_row(row) for row in data] 
print(converted) 

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

import json 

list_of_ee = [["a","m",15],["w","p",34]] 

with open("test.json", "wt") as f: 
    f.write(json.dumps(list_of_ee)) 

with open("test.json", "rt") as f: 
    s = f.read() 
    lst = json.loads(s) 

print(lst) 
assert list_of_ee == lst 

JSON - отличный способ экспортировать данные в другие программы.

Но если вы просто пытаетесь сохранить данные для своих собственных программ Python, это еще проще: просто используйте pickle. http://docs.python.org/2/library/pickle.html

import pickle 

list_of_ee = [["a","m",15],["w","p",34]] 

with open("test.pickle", "wb") as f: 
    f.write(pickle.dumps(list_of_ee)) 

with open("test.pickle", "rb") as f: 
    bytes_data = f.read() 
    lst = pickle.loads(bytes_data) 

print(lst) 
assert list_of_ee == lst 

С pickle вам нужно написать и прочитать файл в двоичном режиме, а не в текстовом режиме. Также с pickle вы можете сэкономить практически любой родной тип Python, а не только базовые, поддерживаемые JSON. Но в значительной степени только программы Python читают файл pickle.

+1

Не забывайте' SyntaxError'. Строки типа '1abc'',' 'bc'', если они присутствуют, поднимут 'SyntaxError'. –

+1

@hcwhsa, спасибо за хедз-ап. – steveha

+0

Это означает, что выражение 'list_of_ee == lst' не оценило true. Другими словами, восстановленный список не равен исходному списку. Я предлагаю вам распечатать оба списка, посмотреть на них и выяснить, почему они разные. Когда я запустил эту программу, это сработало для меня. – steveha

1

Существует не CSV-встроенный способ делать то, что вы просите, поскольку формат CSV не имеет представления о типах данных; то есть он не различает строку и целое число.

Вы можете try делать что-то вроде этого:

for lst in list_of_ee: 
    for i,l in enumerate(lst): 
     try: 
      lst[i] = int(l) 
     except: 
      pass 

преобразовать числовые элементы вашего подсписков в целых числах.

+0

, так что есть ли другой способ сделать это? – user2912389

+0

Если вам не нравится 'try' /' except', вы можете сделать это: 'lst [i] = int (l), если l.isdigit() else l' – steveha

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