嵌套for循环在python中读取相同的csv文件时不起作用

嵌套for循环在python中读取相同的csv文件时不起作用,python,python-3.x,csv,nested-loops,Python,Python 3.x,Csv,Nested Loops,我是python的初学者,试图通过谷歌搜索找到解决方案。然而,我找不到任何我想要的解决方案 我试图用python对数据进行预处理,从大型csv文件中查找关键字并获取包含关键字的所有行 不管怎样,嵌套循环只经过一次,然后在第二个循环中就不经过了 下面显示的代码是我代码的一部分,它从csv文件中查找关键字并写入文本文件 def main(): #Calling file (Directory should be changed) data_file = 'dataset.json'

我是python的初学者,试图通过谷歌搜索找到解决方案。然而,我找不到任何我想要的解决方案

我试图用python对数据进行预处理,从大型csv文件中查找关键字并获取包含关键字的所有行

不管怎样,嵌套循环只经过一次,然后在第二个循环中就不经过了

下面显示的代码是我代码的一部分,它从csv文件中查找关键字并写入文本文件

def main():
   #Calling file (Directory should be changed)
   data_file = 'dataset.json'
   #Loading data.json file
   with open(data_file, 'r') as fp:
       data = json.load(fp)

       #Make the list for keys    
       key_list = list(data.keys())
       #print(key_list)
   preprocess_txt = open("test_11.txt", "w+", -1, "utf-8")
   support_fact = 0

   for i, k in enumerate(key_list):
       count = 1
       #read csv, and split on "," the line  
       with open("my_csvfile.csv", 'r', encoding = 'utf-8') as csvfile:
           reader = csv.reader(csvfile)
           #The number of q_id is 2
           #This is the part that the nested for loop doesn't work!!!!!!!!!!!!!!!!!!!!!!!!!!!!
           if len(data[k]['Qids']) == 2:
               print("Number 2")
               for m in range(len(data[k]['Qids'])):
                   print(len(data[k]['Qids']))
                   q_id = [data[k]['Qids'][m]]
                   print(q_id)
                   for row in reader: #--->This nested for loop doesn't work after going through one loop!!!!!
                       if all([x in row for x in q_id]):
                           print("YES!!!")
                           preprocess_txt.write("%d %s %s %s\n" % (count, row[0], row[1], row[2]))
                               count += 1
有关上述代码的详细信息

首先,它从data.json文件中提取所有键,然后将这些键放入listkey_列表中

其次,我使用all[x in row for x in q_id]方法检查包含关键字q_id的每一行

但是,正如我在上面的代码中所评论的,当数据[k]['Qids']的长度为2时,它会打印出YES!!!第一次循环正确,但不打印是!!!在第二个循环中,这意味着即使csv文件包含关键字,它也不会进入读卡器循环中的for行

打印图如下图所示

我做错了什么。。?或者我应该为代码添加什么使其工作

有人能帮我吗

谢谢你的关注

我相信您的reader变量只包含csv文件的第一行,因此for row in reader只执行一次

尝试:

newline=是上面介绍的新参数

参考:

Quote:如果csvfile是一个文件对象,那么应该使用newline=

打开它。我相信您的reader变量只包含csv文件的第一行,因此for row in reader只执行一次

尝试:

newline=是上面介绍的新参数

参考:


Quote:如果csvfile是一个文件对象,那么应该使用newline=

打开它。例如,假设我有一个CSV文件,它看起来像这样:

foods.csv

以及以下代码,用于模拟当前代码的结构:

def main():
    import csv

    keywords = ["apple", "pie"]

    with open("foods.csv", "r") as file:
        reader = csv.reader(file)

        for keyword in keywords:
            for row in reader:
                if keyword in row:
                    print(f"{keyword} was in {row}")

        print("Done")

main()
理想的结果是,对于我的关键字列表中的每个关键字,如果该关键字存在于我的CSV文件的一行中,我将在屏幕上打印一个字符串,指示该关键字出现在哪一行

但是,以下是实际输出:

apple was in ['beef', 'stew', 'apple', 'sauce']
apple was in ['apple', 'pie', 'potato', 'salami']
Done
>>> 
它能够在文件中找到关键字apple的两个实例,但没有找到pie!那么,有什么好处呢

问题

本例中的文件句柄csvfile只生成一次其内容,然后将其使用。我们的reader对象环绕文件句柄并使用其内容,直到它们耗尽为止,此时将没有行可从文件中读取内部文件指针已前进到末尾,并且内部for循环将不会再次执行

解决方案

在外部for循环每次迭代后,使用seek将内部文件指针移到开头,或者将文件内容读入列表或类似集合一次,然后在列表上迭代:

更新代码:

def main():
    import csv

    keywords = ["apple", "pie"]

    with open("foods.csv", "r") as file:
        contents = list(csv.reader(file))

        for keyword in keywords:
            for row in contents:
                if keyword in row:
                    print(f"{keyword} was in {row}")

        print("Done")

main()
新产出:

apple was in ['beef', 'stew', 'apple', 'sauce']
apple was in ['apple', 'pie', 'potato', 'salami']
pie was in ['apple', 'pie', 'potato', 'salami']
pie was in ['tomato', 'cherry', 'pie', 'bacon']
Done
>>> 

例如,假设我有一个CSV文件,如下所示:

foods.csv

以及以下代码,用于模拟当前代码的结构:

def main():
    import csv

    keywords = ["apple", "pie"]

    with open("foods.csv", "r") as file:
        reader = csv.reader(file)

        for keyword in keywords:
            for row in reader:
                if keyword in row:
                    print(f"{keyword} was in {row}")

        print("Done")

main()
理想的结果是,对于我的关键字列表中的每个关键字,如果该关键字存在于我的CSV文件的一行中,我将在屏幕上打印一个字符串,指示该关键字出现在哪一行

但是,以下是实际输出:

apple was in ['beef', 'stew', 'apple', 'sauce']
apple was in ['apple', 'pie', 'potato', 'salami']
Done
>>> 
它能够在文件中找到关键字apple的两个实例,但没有找到pie!那么,有什么好处呢

问题

本例中的文件句柄csvfile只生成一次其内容,然后将其使用。我们的reader对象环绕文件句柄并使用其内容,直到它们耗尽为止,此时将没有行可从文件中读取内部文件指针已前进到末尾,并且内部for循环将不会再次执行

解决方案

在外部for循环每次迭代后,使用seek将内部文件指针移到开头,或者将文件内容读入列表或类似集合一次,然后在列表上迭代:

更新代码:

def main():
    import csv

    keywords = ["apple", "pie"]

    with open("foods.csv", "r") as file:
        contents = list(csv.reader(file))

        for keyword in keywords:
            for row in contents:
                if keyword in row:
                    print(f"{keyword} was in {row}")

        print("Done")

main()
新产出:

apple was in ['beef', 'stew', 'apple', 'sauce']
apple was in ['apple', 'pie', 'potato', 'salami']
pie was in ['apple', 'pie', 'potato', 'salami']
pie was in ['tomato', 'cherry', 'pie', 'bacon']
Done
>>> 

为什么要多次打开该文件?打开它一次,然后对数据执行任何操作@为什么要多次打开该文件?打开它一次,然后对数据执行任何操作@保罗:哦。。。这就是为什么。。。。!当我做这些事情时,我可能会记住!!!:DD感谢您对示例的解释!:哦这就是为什么。。。。!当我做这些事情时,我可能会记住!!!:DD感谢您对示例的解释!: