Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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,最后一行给出了: ValueError:对关闭的文件执行I/O操作 如何解决这些问题 关于第一个问题,txt中只打印最后一个插入,而它应该显示所有插入 -更新 folder = path.Path(r"C:\Users\user\Desktop\SHAPE") shapefiles = [] for shpfile in glob.iglob('**/Desktop/SHAPE/**/' ,recursive = True): try: shapefiles.append

最后一行给出了:

ValueError:对关闭的文件执行I/O操作

如何解决这些问题

关于第一个问题,txt中只打印最后一个插入,而它应该显示所有插入

-更新

folder = path.Path(r"C:\Users\user\Desktop\SHAPE")
shapefiles = []
for shpfile in glob.iglob('**/Desktop/SHAPE/**/' ,recursive = True):
    try:
        shapefiles.append(geopandas.read_file(shpfile))
    except FionaValueError as ex:
        if not os.listdir(shpfile):
            sys.stdout = open('log.txt', 'w')
            print(f'{shpfile} is empty')

您能告诉我如何将打印的结果写入txt吗?

正确的结果应该是:

with open('log1.txt', 'a') as myFile:
    for i in range(1,123):
        if i%2 ==0:
            myFile.write(str(i) + '\n')
更正您的代码如下所示:

import sys

sys.stdout = open('log1.txt', 'a')
for i in range(1,123):
    if i%2 ==0:
        print(i)
sys.stdout.close()
您应该在迭代之外打开文件。您正在用写模式覆盖现有文件。

文件现在包含:

2
4
6
8
10
12
14
16
18
20
22
24
26
28
30
32
34
36
38
40
42
44
46
48
50
52
54
56
58
60
62
64
66
68
70
72
74
76
78
80
82
84
86
88
90
92
94
96
98
100
102
104
106
108
110
112
114
116
118
120
122

我认为你可以从列表理解中获益匪浅,请考虑下面的内容:

[str(i) for i in range(1,123) if i%2 == 0]
它创建一个字符串序列。然后你可以继续用join来搞定它

完整示例

with open('log1.txt', 'w') as f:
    f.write('\n'.join([str(i) for i in range(1,123) if i%2 == 0]))

你想达到什么目标?只需在文件中写入一些偶数?如果是这样:
以open('filename.txt','w')作为file:file.write('some text')
应该可以开始了。忘记
sys.stdout
。您不必每次遇到偶数时都打开文件。改用a,然后在那里完成所有工作。我刚刚更正了OP的代码,实际上它不是我的代码。你能写下如何解决更新代码中出现的更困难的情况吗?@user10154844你可以随时使用open('log.txt'))然后用上面的例子把你的日志写进去。如果你用w替换“a”,你会发现用“w”替换的是正确的,而用“a”替换的结果非常奇怪。检查此outa意味着追加,w写入。如果文件存在,则覆盖文件如果存在,则“a”只是附加项,否则创建。我认为正确地考虑你想要的,并使用正确的打开文件模式。看看:在这样的任务中使用列表理解是有效的吗?如果数据量太大怎么办?你能告诉我如何使用问题中的更新代码吗?为什么不仅仅是
range(2123,2)
?@hiroprotation这是一个很好的问题。但是这个例子展示了如何在列表中使用if语句。可能有更多的条件需要满足,那么这一步骤是不够的。
with open('log1.txt', 'w') as f:
    f.write('\n'.join([str(i) for i in range(1,123) if i%2 == 0]))