首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件导入NamedTuple

将文件导入NamedTuple
EN

Stack Overflow用户
提问于 2011-04-29 09:11:48
回答 3查看 8.4K关注 0票数 5

最近我遇到了一个关于数据类型的问题。

从那以后,我一直在尝试使用NamedTuples (或多或少地成功了)。

我现在的问题是:

  • 如何将行从文件导入到新的元组,
  • 如何将用空格/制表符(/whatever)分隔的值导入到元组的给定部分?

比如:

代码语言:javascript
复制
Monday  8:00    10:00   ETR_28135   lh1n1522    Computer science    1     
Tuesday 12:00   14:00   ETR_28134   lh1n1544    Geography EA    1  

第一行应该是元组。第一个数据: tuple.day;第二个: tuple.start;..and等等。

当新行开始时(即两个TAB (\t),启动一个新的元组,如tuple1)。

我用它来分离数据:

在f: rawData = line.strip().split('\t')中将open(Filename)作为f: for行

其余的逻辑仍然缺失(元组的填充)。

(我知道。这个问题和最近的一个问题都是很低层次的问题。然而,希望这些也能帮助到别人。如果你觉得这不是一个真正的问题,太简单而不能成为一个问题等等,就投票结束吧。(谢谢你的理解。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-29 09:37:58

这样的数据库文件被称为逗号分隔的值,即使它们实际上不是用逗号分隔的。Python有一个名为csv的方便的库,它允许您轻松地读取此类文件。

下面是一个稍微修改过的文档中的示例

代码语言:javascript
复制
csv.register_dialect('mycsv', delimiter='\t', quoting=csv.QUOTE_NONE)
with open(filename, 'rb') as f:
    reader = csv.reader(f, 'mycsv')

通常你一次只工作一行。如果您需要一个元组中的整个文件,那么:

代码语言:javascript
复制
t = tuple(reader)

编辑

如果您需要按名称访问字段,可以使用cvs.DictReader,但我不知道它到底是如何工作的,我无法在这里测试它。

编辑2

看看名元组是什么,我有点过时了。关于namedtuple如何使用csv模块,有一个很好的例子:

代码语言:javascript
复制
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for line in csv.reader(open("employees.csv", "rb")):
    emp = EmployeeRecord._make(line)
    print emp.name, emp.title
票数 12
EN

Stack Overflow用户

发布于 2011-04-29 09:52:41

这里有一种简洁的方法来做这样的事情。首先声明行项的类:

代码语言:javascript
复制
fields = "dow", "open_time", "close _time", "code", "foo", "subject", "bar"
Item = namedtuple('Item', " ".join(fields)) 

下一部分在你的循环里。

代码语言:javascript
复制
# this is what your raw data looks like after the split:
#raw_data = ['Monday', '8:00', '10:00', 'ETR_28135', 'lh1n1522', 'Computer science', '1']
data_tuple = Item(**dict(zip(fields, raw_data)))

现在慢慢地:

  • zip(fields, raw_data)创建一个成对列表,如[("dow", "Monday"), ("open_time", "8:00"),..]
  • 然后dict()把它变成字典,就像{"dow": "Monday", "open_time": "8:00", ..}一样
  • 然后,**将该字典解释为一组关键字参数给Item构造函数,这相当于Item(dow="Monday", open_time="8:00",..)

因此,您的项名为元组,所有值都是字符串。

编辑:

如果字段的顺序不会改变,您可以轻松得多:

代码语言:javascript
复制
data_tuple = Item(*raw_data)

这使用了文件中字段的顺序与Item定义中的参数顺序相匹配的事实。

票数 3
EN

Stack Overflow用户

发布于 2011-04-29 09:54:19

如果您想使用NamedTuple,可以使用Python文档中给出的示例的稍微修改的版本:

代码语言:javascript
复制
MyRecord = namedtuple('MyRecord', 'Weekday, start, end, code1, code2, title, whatever')

import csv
for rec in map(MyRecord._make, csv.reader(open("mycsv.csv", "rb"), delimiter='\t')):
    print rec.weekday
    print rec.title
    # etc...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5830197

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档