Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.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
为什么这个python代码与自身冲突?_Python - Fatal编程技术网

为什么这个python代码与自身冲突?

为什么这个python代码与自身冲突?,python,Python,当我试着跑的时候 import csv import sys import operator fieldnames = ["A","B","C","D","E"] surveyfile = open("source.csv", "r") left_file = open("left.csv",'wb') right_file = open("right.csv",'wb') left_reader = csv.DictReader(surveyfile, fieldnames=fieldn

当我试着跑的时候

import csv
import sys
import operator

fieldnames = ["A","B","C","D","E"]
surveyfile = open("source.csv", "r")
left_file = open("left.csv",'wb')
right_file = open("right.csv",'wb')


left_reader = csv.DictReader(surveyfile, fieldnames=fieldnames, delimiter=",")
left_writer = csv.DictWriter(left_file, fieldnames, delimiter=",")
sortedlefts = sorted(left_reader,key=lambda x:float(x["B"]))

right_reader = csv.DictReader(surveyfile, fieldnames=fieldnames, delimiter=",")
right_writer = csv.DictWriter(right_file, fieldnames, delimiter=",")
sortedrights = sorted(right_reader,key=lambda x:float(x["B"]), reverse=True)

for row in sortedlefts:
    if row["E"] == "l":
        left_writer.writerow(row)


for row in sortedrights:
    if row["E"] == "r":
        right_writer.writerow(row)

“right.csv”文件中没有任何内容。但是,如果我把所有与制作正确的.csv文件有关的东西都拿出来,并把它放进一个不同的程序中,它就可以正常工作了。我需要结束这个循环吗?使用相同的读取器处理这两个问题是否有问题?

输入文件可能已用尽,因此是的,这与重新使用
读取器
实例有关

不知道为什么您希望
阅读器
对象神奇地知道何时应该重新传递数据


您需要更明确地说明这一点,我只建议根据需要重新创建阅读器

读卡器
耗尽确实是一个问题。您可以创建一个单独的for循环,并结合一些
itertools
帮助来解决此问题

import itertools

left_reader, right_reader = itertools.tee(reader)

sortedlefts = sorted(left_reader,key=lambda x:float(x["B"]))
sortedrights = sorted(right_reader,key=lambda x:float(x["B"]), reverse=True)

for left, right in itertools.izip(sortedlefts, sortedrights):
    if left['E'] == 'l':
        left_writer.writerow(left)
    if right['E'] == 'r':
        right_writer.writerow(right)

我修改了问题中的代码,使用了两个不同的阅读器,但仍然不起作用。很抱歉,我以前从未真正编程过-我不知道如何“更明确”。@user1879422“展开”的意思是
文件本身已用尽(即,由于
左读器已阅读所有内容,因此没有任何内容可供阅读)。关闭文件并再次打开,或者使用
surveyfile.seek()
返回到其开头。哇,15分钟内有3个响应-你们真是太棒了!!我在两个阅读器之间放置了一个surveyfile.seek(0,0),它工作得非常完美。非常感谢。这可能是做事情的最好方式,但这似乎让我不知所措。它说itertools没有定义。我甚至都不知道那是什么,哈哈。我会去调查一下,看看我能不能把你的回答写进去。显然,这似乎是一种更优雅的方式。@user1879422 A抱歉,请尝试在文件顶部执行一个
import itertools
。这些是我在
itertools
中使用的两个函数的文档链接。和。