Python-将文件导入NamedTup

2024-04-29 01:00:12 发布

您现在位置:Python中文网/ 问答频道 /正文

最近我有一个关于数据类型的问题。
从那以后,我一直在尝试使用NamedTuples(或多或少是成功的)。

我目前的问题:
-如何将文件中的行导入新元组,
-如何将用空格/tab(/whatever)分隔的值导入元组的给定部分?

比如:

Monday  8:00    10:00   ETR_28135   lh1n1522    Computer science    1     
Tuesday 12:00   14:00   ETR_28134   lh1n1544    Geography EA    1  

第一行应该进入元组[0]。第一个数据:tuple[0].day;第二个数据:tuple[0].start;。依此类推。
当新行开始时(这是两个TAB(\t),启动一个新的元组,如tuple[1])。

我用这个来分离数据:

with open(Filename) as f:
    for line in f:
        rawData = line.strip().split('\t')  

剩下的逻辑仍然缺失(元组的填充)。

(我知道。这个问题,还有最近的一个,都是很低级的问题。不过,希望这些也能帮助别人。如果你觉得这不是一个真正的问题,太简单而不是一个问题等等,就投票结束吧。感谢您的理解。)


Tags: 文件数据linetabcomputerscience元组数据类型
3条回答

这里有一个紧凑的方法来做这些事情。 首先声明行项目的类:

fields = "dow", "open_time", "close _time", "code", "foo", "subject", "bar"
Item = namedtuple('Item', " ".join(fields)) 

下一部分在你的循环中。

# 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",..)

所以你的项被命名为元组,所有的值都是字符串。

编辑:

如果字段的顺序不会更改,则可以更轻松地执行此操作:

data_tuple = Item(*raw_data)

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

这种数据库文件被称为逗号分隔值,即使它们不是真正由逗号分隔的。Python有一个叫做csv的便利库,可以让您轻松地读取这些文件

这里有一个稍微修改过的example from the docs

csv.register_dialect('mycsv', delimiter='\t', quoting=csv.QUOTE_NONE)
with open(filename, 'rb') as f:
    reader = csv.reader(f, 'mycsv')

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

t = tuple(reader)

编辑

如果需要按名称访问字段,可以使用cvs.DictReader,但我不知道具体是如何工作的,因此无法在这里进行测试。

编辑2

看看namedtuples是什么,我有点过时了。有一个很好的例子说明了namedtuple如何与csv模块一起工作:

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

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

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...

相关问题 更多 >