Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
csv文件行提取的Python列表理解计算不正确_Python_List_Csv - Fatal编程技术网

csv文件行提取的Python列表理解计算不正确

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:

我正在阅读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:','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展开。很好的技巧。我自己也不知道。谢谢