我有一个包含数千行的生成的文件,如下所示:
CODE,XXX,DATE,20101201,TIME,070400,CONDITION_CODES,LTXT,PRICE,999.0000,QUANTITY,100,TSN,1510000001
有些行的字段更多,而其他行的字段较少,但是所有行都遵循相同的键值对模式,每行都有一个TSN字段。
在对文件进行一些分析时,我编写了如下所示的循环,以将文件读入字典:
#!/usr/bin/env python
from sys import argv
records = {}
for line in open(argv[1]):
fields = line.strip().split(',')
record = dict(zip(fields[::2], fields[1::2]))
records[record['TSN']] = record
print 'Found %d records in the file.' % len(records)
…这很好,并且确实满足我的要求(这print
只是一个简单的示例)。
但是,对于我和以下内容而言,它并不是特别“ pythonic”:
dict(zip(fields[::2], fields[1::2]))
哪个感觉“笨拙”(在字段上迭代了多少次?)。
仅使用标准模块,在python 2.6中有更好的方法吗?
在Python
2中,您可以izip
在itertools
模块和生成器对象中使用魔术来编写自己的函数,以简化dict
记录值对的创建。我pairwise()
从Python
2文档中一个类似命名(但功能不同)的食谱中得到了这个想法itertools
。
要在Python 3中使用该方法,您可以使用plain,zip()
因为它的作用与izip()
在Python 2中的作用相同,导致将后者从python
2中删除itertools
了。
try:
from itertools import izip
except ImportError: # Python 3
izip = zip
def pairwise(iterable):
"s -> (s0,s1), (s2,s3), (s4, s5), ..."
a = iter(iterable)
return izip(a, a)
在文件读取for
循环中可以这样使用:
from sys import argv
records = {}
for line in open(argv[1]):
fields = (field.strip() for field in line.split(',')) # generator expr
record = dict(pairwise(fields))
records[record['TSN']] = record
print('Found %d records in the file.' % len(records))
但是,等等,还有更多!
可以创建一个通用的版本,我将其称为grouper()
,再次对应于一个名称相似但功能不同的itertools
配方(在下面列出pairwise()
):
def grouper(n, iterable):
"s -> (s0,s1,...sn-1), (sn,sn+1,...s2n-1), (s2n,s2n+1,...s3n-1), ..."
return izip(*[iter(iterable)]*n)
在for
循环中可以这样使用:
record = dict(grouper(2, fields))
当然,对于像这样的特定情况,很容易使用它functools.partial()
并创建类似的pairwise()
函数(将在Python
2和3中都可以使用):
import functools
pairwise = functools.partial(grouper, 2)
后记
除非字段的数量非常多,否则您可以改为从订单项对中创建实际的序列(而不是使用没有的生成器表达式len()
):
fields = tuple(field.strip() for field in line.split(','))
好处是,它将允许使用简单的切片来完成分组:
try:
xrange
except NameError: # Python 3
xrange = range
def grouper(n, sequence):
for i in xrange(0, len(sequence), n):
yield sequence[i:i+n]
pairwise = functools.partial(grouper, 2)
我正在用Swift编写我的第一个MacOS应用程序。我需要创建一个简单的可编辑文本框,允许多个段落。在HTML中,这将是一个。 我推测iOS14将包含
如何从android项目中创建jar文件,该项目包含android工作室中的facebook库和viewPager库
如何创建MP3从任何文本与谷歌TTS? 1) 我试图找到谷歌。翻译API,但只找到“音频到文本”,除了“文本到音频”! 2) 我试着把语音合成转换成mp3,但还是一无所获! 3) 我发现只有一个网站“beta.soundoftext.com”,它们生成的mp3音频文件没有API接口。 所以,有人能帮我吗?我正在为我的网站(专用服务器)寻找任何将文本转换为语音的方法。谢谢!
问题内容: 我有一个像这样的文本文件: 我想要一个像这样的字符串数组: 我试过了 : 任何人都可以帮助我…。所有答案将不胜感激… 问题答案: 根据您的输入,您就快到了。您错过了循环中保持从文件读取每一行的关键点。由于您不事先知道文件中的总行数,因此请使用集合(动态分配的大小)来获取所有内容,然后将其转换为的数组(这是您想要的输出)。 像这样: 那么输出()将是: 这不是最佳解决方案。其他更 聪明的
问题内容: 我正在尝试将String传递给我的。如何通过针对读者的“测试” 而不是来自读者的输入? 问题答案: 您可以如下修改代码
问题内容: 我正在遵循指南,它为我提供了以下代码: 我想知道的是如何仍然可以创建一个,但是不要读取文件的内容,而要使用一个已有的变量。 问题答案: 使用而不是。 请参阅StringReader的文档 例: