csv文件行提取的Python列表理解计算不正确
我正在阅读Python 2.7中的csv文件。每当第一个“x”字符与列表中指定的任何条目匹配时,我想从csv文件中提取一行 下面是我现在使用的一些工作代码:csv文件行提取的Python列表理解计算不正确,python,list,csv,Python,List,Csv,我正在阅读Python 2.7中的csv文件。每当第一个“x”字符与列表中指定的任何条目匹配时,我想从csv文件中提取一行 下面是我现在使用的一些工作代码: with open('input_file.txt', 'rb+') as infile: with open('output_file.txt', 'wb+') as outfile: searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:
with open('input_file.txt', 'rb+') as infile:
with open('output_file.txt', 'wb+') as outfile:
searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:']
for row in infile:
for x in searchValues:
if row[0:len(x)] == x:
outfile.write(row)
我想用列表来简化。不幸的是,我无法让它工作。以下是我尝试过的:
with open('input_file.txt', 'rb+') as infile:
with open('output_file.txt', 'wb+') as outfile:
searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:']
for row in infile:
## for x in searchValues:
## if row[0:len(x)] == x:
if [row[0:len(x)] == x for x in searchValues]:
outfile.write(row)
列表理解版本运行时没有错误。但输出文件是nput文件的直接副本,因此筛选检查列表理解行不起作用。请帮助识别错误。您很接近!用于检查这些列表项中是否有任何项为真。此外,还应该使用startswith来提高可读性。最后,使用Python 2.7+,您可以将这两个语句结合起来:
with open('input_file.txt', 'rb+') as infile, open('output_file.txt', 'wb+') as outfile:
searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:']
for row in infile:
if any(row.startswith(x) for x in searchValues):
outfile.write(row)
列表理解不起作用的原因是,如果没有前缀应用,列表中的每个值都将为False,但由于,该条件仍然满足
为了完整性:您还可以使用if[i for i in s if row.startswithi];如果所有搜索值都不是该行的前缀,则这将创建一个空列表,然后该行的计算结果将为False
然而,使用any不仅可读性更强,而且应该更快。你已经接近了!用于检查这些列表项中是否有任何项为真。此外,还应该使用startswith来提高可读性。最后,使用Python 2.7+,您可以将这两个语句结合起来:
with open('input_file.txt', 'rb+') as infile, open('output_file.txt', 'wb+') as outfile:
searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:']
for row in infile:
if any(row.startswith(x) for x in searchValues):
outfile.write(row)
列表理解不起作用的原因是,如果没有前缀应用,列表中的每个值都将为False,但由于,该条件仍然满足
为了完整性:您还可以使用if[i for i in s if row.startswithi];如果所有搜索值都不是该行的前缀,则这将创建一个空列表,然后该行的计算结果将为False
但是,使用any不仅可读性更强,而且应该更快。列表理解解决方案
我不知道你为什么要做列表理解。python的方法是
from contextlib import nested
searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:']
with nested(open('input_file.txt', 'rb+'), open('output_file.txt', 'wb+')) as (infile, outfile):
for row in infile:
if any(row.startswith(x) for x in searchValues):
outfile.write(row)
具有列表理解的解决方案
我不知道你为什么要做列表理解。python的方法是
from contextlib import nested
searchValues = ['26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:']
with nested(open('input_file.txt', 'rb+'), open('output_file.txt', 'wb+')) as (infile, outfile):
for row in infile:
if any(row.startswith(x) for x in searchValues):
outfile.write(row)
我将假设您的搜索键始终是字符串中以冒号分隔的前两个项目;因此,您的代码可以变成:
INPUT = "input_file.txt"
OUTPUT = "output_file.txt"
# set of key values to match
search_keys = {'26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:'}
def get_key(s, num=2, delimiter=":"):
try:
last = -1
for i in range(num):
last = s.index(delimiter, last+1)
return s[:last+1]
except ValueError:
return None
def main():
with open(INPUT) as infile, open(OUTPUT, "w") as outfile:
for row in infile:
if get_key(row) in search_keys:
outfile.write(row)
if __name__=="__main__":
main()
请注意,这是Ofile_行,其他行是Ofile_行*搜索项
这将适用于任何条件,您可以查看字符串并知道搜索键是什么;只需适当地重写get_键。我将假设您的搜索键始终是字符串中以冒号分隔的前两项;因此,您的代码可以变成:
INPUT = "input_file.txt"
OUTPUT = "output_file.txt"
# set of key values to match
search_keys = {'26:42:','1559:10935:','3345:26259:','4897:36651:','4909:36919:'}
def get_key(s, num=2, delimiter=":"):
try:
last = -1
for i in range(num):
last = s.index(delimiter, last+1)
return s[:last+1]
except ValueError:
return None
def main():
with open(INPUT) as infile, open(OUTPUT, "w") as outfile:
for row in infile:
if get_key(row) in search_keys:
outfile.write(row)
if __name__=="__main__":
main()
请注意,这是Ofile_行,其他行是Ofile_行*搜索项
这将适用于任何条件,您可以查看字符串并知道搜索键是什么;只需适当地重写get_键。是否总是在冒号分隔的字符串中搜索前两个值?@HughBothwell-是,但仅针对当前实现。脚本的未来使用可能不会遵循此规则。是否始终搜索冒号分隔字符串中的前两个值?@HughBothwell-是,但仅搜索当前实现。脚本的未来使用可能不会遵循此规则。感谢您的回复。这很简单-我想使用列表理解,因为我是一个业余爱好者,不知道更好的方法。谢谢你教我一种更像蟒蛇的方法!谢谢你的回复。这很简单-我想使用列表理解,因为我是一个业余爱好者,不知道更好的方法。谢谢你教我一种更像蟒蛇的方法!我真的很欣赏大家的反应,尤其是对表现的关注。我当前的文件不太大,这将产生巨大的差异~200000行,因此我认为我将使用较短的方法之一。但是,如果要搜索更大的文件,这肯定很方便。我非常感谢您的回复,尤其是对性能的关注。我当前的文件不太大,这将产生巨大的差异~200000行,因此我认为我将使用较短的方法之一。但是如果要搜索更大的文件,这肯定会很方便。谢谢您的回复。我真的很感激对我的方法不起作用的解释。你的解决方案对我来说非常有效。我特别感谢你花时间给我展示了一些关于startswith和double open的新技巧。在阅读文档时,我似乎可以通过将SearchValue定义为元组,并将其直接传递给StartS来进一步优化,同时避免显式使用any和for展开。很好的技巧。我自己也不知道。谢谢谢谢你的回复。我真的很感激对我的方法不起作用的解释。你的解决方案对我来说非常有效。我特别感谢你花时间给我展示了一些新技巧 s关于在同一线路上启动和双重打开。在阅读文档时,我似乎可以通过将SearchValue定义为元组,并将其直接传递给StartS来进一步优化,同时避免显式使用any和for展开。很好的技巧。我自己也不知道。谢谢