【问题标题】:Import csv as list of list in python 3.3在 python 3.3 中导入 csv 作为列表列表
【发布时间】:2013-11-04 00:09:45
【问题描述】:

我有一个包含 2 个字符串和 1 个整数的列表

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']]

但我想在list_of_ee 中导入与之前相同的结果(作为列表列表和 2 个 str 和 1 个整数)(当我的程序重新启动时) 我想将它们添加到list_of_ee(因为程序启动时没有数据 list_of_ee.

【问题讨论】:

标签: python list csv python-3.x import


【解决方案1】:

由于 CSV 格式没有数据类型的概念,因此没有 CSV 内置的方式来执行您所要求的操作;也就是说,它不区分字符串和整数。

你可以 try 做这样的事情:

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

将子列表的数字元素转换为整数。

【讨论】:

  • 那么还有其他方法吗?
  • 如果你不喜欢try/except,你可以这样做:lst[i] = int(l) if l.isdigit() else l
【解决方案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 程序保存数据,那就更简单了:只需使用 picklehttp://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 文件。

【讨论】:

  • 别忘了SyntaxError。像'1abc''a bc' 这样的字符串如果存在将引发SyntaxError
  • 这意味着表达式list_of_ee == lst 的计算结果不正确。换句话说,恢复的列表不等于原始列表。我建议您打印这两个列表,查看它们,并找出它们不同的原因。当我运行该程序时,它对我有用。
  • 我什至不明白你刚才问了什么。您是在问assert 是否会在您的程序中触发?你甚至不必写assert 声明。
  • 首先对不起,因为我不懂泡菜.ya。我删除并尝试过。它不会(在我的程序中)将数据附加到我的程序列表中?
猜你喜欢
  • 2015-07-06
  • 2012-12-31
  • 2018-02-25
  • 2014-08-31
  • 2015-07-04
  • 2014-09-12
相关资源
最近更新 更多