【问题标题】:Python: Why is the content of the file deleted when I save the changes?Python:为什么我保存更改时文件的内容会被删除?
【发布时间】:2021-08-04 07:17:28
【问题描述】:

我有test_final.txt,上面有一些简单的词,几句话。我想使用shuffle 方法来混合单词。最大的问题是,运行代码后,我的test_final.txt 变为空。第二个问题,不知道为什么Shuffle方法不行。

import random
import re 
import sys
f = open("test_final.txt", "r")
print(f.read())

mama = r"([a-zA-Z]+) (\d+)"
listOfWords = re.findall(mama, 'f')
print("Result: ", listOfWords)

random.Random(4).shuffle(listOfWords)
print("Shuffled stuff: ", listOfWords)


finalString = ""
for cuvant in listOfWords: 
    finalString = finalString + cuvant + " "
finalString = finalString.strip()
print(finalString)

#SAve

with open("test_final.txt", "w", encoding = 'utf-8') as file:

   file.write(finalString)
  • 比如我有一些话变成了test_final.txt

my book is still here,输出应该是这样的 still book here is my.

  • 运行代码后,test_final.txt 变为空。 (问题出在 save 方法上。但是,如果我在没有 save 的情况下进行测试,它不会像我需要的那样将这个词与 Shuffle Method 混合

【问题讨论】:

  • listOfWords = re.findall(mama, 'f') - 你能解释一下'f'是什么意思吗?
  • 您在第四行以读取模式打开同一个文件,并且从不关闭它。所以要么在阅读后致电f.close(),要么使用with
  • f 来自f = open("test_final.txt", "r")(我尝试与文件建立连接)
  • edit 显示示例输入文件并说明您真正想要的结果。
  • 我更新帖子

标签: python python-3.x python-requests


【解决方案1】:

您的代码有多个问题。

print(f.read())

将行打印到标准输出,并将文件句柄留在文件末尾。如果您现在尝试从f 读取更多内容,您将得到一个空字符串。

因为您正在读取这些行而不将它们存储在任何地方,或者在后续代码中生成任何新行(见下文),当然您最终不会向新文件写入任何内容。

mama = r"([a-zA-Z]+) (\d+)"
listOfWords = re.findall(mama, 'f')

在静态字符串'f' 中搜索后跟空格和数字序列的单词;当然,'f' 不包含任何空格或数字,因此listOfWords 最终为空。您的意思是从变量f 中读取吗?虽然那也行不通; findall 需要一个字符串,而不是文件句柄,作为它的第二个参数。

正如在其他地方已经指出的那样,在您尝试覆盖同一个文件时让f 保持打开状态不会可靠地工作。在尝试写入同一文件之前,您需要关闭 f

不清楚你为什么打电话给random.Random(4);我将简单地假设您希望使用均匀分布随机打乱列表。

根据您的问题描述,您希望单词列表包含文件中的单词作为单独的字符串。您当前的代码没有做类似的事情,但它很容易做到;只需split 该行并将其添加到您的列表中。

相当疯狂地猜测你可能真正想要什么,试试下面的。

import random
import re 
# import sys  # unused import


# Changed the regex so that it can actually match words
mama = r"[a-zA-Z]+\d*"

# Python variables should prefer snake_case over headlessCamelCase
list_of_words = []
# Specify encoding here, too
with open("test_final.txt", "r", encoding="utf-8") as f:
    for line in f:
        for word in line.rstrip('\n').split():
            # Does this line match the regular expression?
            if re.match(mama, word):
                list_of_words.append(word)
            else:
                # Print a warning when we are discarding a line
                print('# discarding', word)

print("Result: ", list_of_words)

random.shuffle(list_of_words)
print("Shuffled stuff: ", list_of_words)

finalString = " ".join(list_of_words)
print(finalString)

with open("test_final.txt", "w", encoding = 'utf-8') as file:
   file.write(finalString)

演示:https://ideone.com/fBXb8v

我仍然会注意到代码重新排列文件以将所有内容放在一行中,我们从原始文件中逐行读取的字符串之间有空格。这似乎具有潜在的破坏性;我会将在单独的行中读取的任何内容保留在单独的行中,以使该过程稳定且可重复。

【讨论】:

  • 也是一样的,就是运行代码后删除文本文件。并且不会进行随机播放(混合单词)
  • 这是一个改进,谢谢。你还能解释一下正则表达式应该做什么吗?您的示例文本确实与正则表达式不匹配。
  • 立即查看有关split() 的更新。今后,请尝试在每个帖子中提出一个明确的问题。
  • 我无法重现;该代码对我有用。立即查看演示链接。
  • 哇,你真喜欢帮助别人。
【解决方案2】:

您需要关闭文件才能保存它。

file.close()

【讨论】:

  • 我也尝试使用file.close(),但这种方法也会清空我的文本文件,而不是混合单词并保存新的修改
【解决方案3】:

在脚本的开头打开文件并阅读它。之后你不要关闭它。尝试使用with 打开您的第一个文件

import random
import re 
import sys
with open("test_final.txt", "r", encoding = 'utf-8') as f:
    text = f.read()
    print(text)

mama = r"([a-zA-Z]+) (\d+)"
listOfWords = re.findall(mama, 'f')
print("Result: ", listOfWords)

random.Random(4).shuffle(listOfWords)
print("Shuffled stuff: ", listOfWords)


finalString = ""
for cuvant in listOfWords: 
    finalString = finalString + cuvant + " "
finalString = finalString.strip()
print(finalString)

#SAve

with open("test_final.txt", "w", encoding = 'utf-8') as f:
   f.write(finalString)

【讨论】:

  • 是一样的,就是在运行代码后删除文本文件。并且不会进行随机播放(混合单词)
【解决方案4】:

您正在尝试读取和写入同一个文件。不能这样工作。 打开文件进行写入将从一开始就覆盖文件。你可以打开文件 对于以追加模式写入,数据将被追加到文件的末尾,但我想这不是你想要的。通常如果你想改变文件,你需要写一个新的(如果你愿意,然后用新的替换旧的)。

而且,如上所述,最好在阅读后关闭文件。

【讨论】:

  • 你好,我不明白。也许你应该写一个代码解决方案。
  • 我绝对不应该做任何事情。正如您从其他答案中看到的那样,没有人了解您要做什么。添加示例输入和示例输出将极大地帮助那些想要编写代码解决方案的人 - @triplee 看起来既愿意又非常彻底
猜你喜欢
  • 2018-02-14
  • 2015-06-30
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多