嵌套for循环在python中读取相同的csv文件时不起作用
我是python的初学者,试图通过谷歌搜索找到解决方案。然而,我找不到任何我想要的解决方案 我试图用python对数据进行预处理,从大型csv文件中查找关键字并获取包含关键字的所有行 不管怎样,嵌套循环只经过一次,然后在第二个循环中就不经过了 下面显示的代码是我代码的一部分,它从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'
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感谢您对示例的解释!: