如何在不删除文件的情况下向文件添加短语

时间:2019-09-08 02:46:07

标签: python

是“ txt”文件的文本文件。另外,我有不同长度的短语的单独文件(空格计入短语长度),因为它可以是多个单词,所以我看到了短语,但是在下面的示例中,我使用了三个字母单词,所有这些单词都是一个单词。另外,想象每个短语都换行。每个短语用逗号分隔。假设您有一个这样的文件:

app,
bar,
car,
eel,
get,
pod,

我想要的是能够添加一个或多个短语,假定这些短语仅包含小写字母和/或空格。

例如,假设我要按以下顺序添加短语:

(cat, bat, car, hat, mom, rat)

基本上,我想将这些短语添加到文件中而不删除 文件,并确保在文件中没有重复的短语,并确保它们按字母顺序排序。就字母的字母排序而言,假定空格位于字母z之后。因此,输入这些短语之后,文件应如下所示:

'
app,
bar,
bat,
car,
eel,
get,
hat,
mom,
pod,
rat
'

并且将假定每个文件至少成为1 GB的数据。什么是最快/最少的内存消耗/等等。因此,复制文件以完成此操作是不可行的。

我还没有尝试过100%有效的方法。我知道该怎么办,我只是不知道该怎么办。这是我需要完成的要点。

1)确保创建了短语(使用input()函数)

2)打开组织词文件(使用“ with open(filename)”语句)

3)将每个短语放入文件中的“正确”位置。 “正确”是指按字母顺序,而不是重复。

4)确保文件未被删除。

这是我目前所拥有的(改变了一点,它正在做我想要的更多,但不是全部):

phrase_to_add = input('Please enter the phrase: ').lower()
with open('/Users/ian/Documents/three_character_phrases.txt') as file:
    unique_phrases = list(file.read().split())
unique_phrases.append(phrase_to_add)
unique_phrases.sort()
list_of_phrases = set()
for phrase in unique_phrases:
    list_of_phrases.add(phrase)
with open('/Users/ian/Documents/three_character_phrases.txt', 'w') as fin:
    for phrase in list_of_phrases:
        fin.write(phrase + '\n')

因此,我首先将两个文件都为空,然后将“ cow”一词添加到输入中,文件看起来像这样:

three_character_phrases.txt:

cow

然后我输入单词“ bat”,我明白了:

bat
cow

然后我添加了单词“ bawk”(我知道这不是3个字母的单词,但是我会确保将正确的单词放入正确的文件中)

我明白了:

bawk
bat
cow

1 个答案:

答案 0 :(得分:0)

您似乎正在沉迷于实现中,而不是试图去理解概念,所以让我邀请您退后一步。

您的数据结构类似于列表(因为顺序是相关的),但不允许重复。

['act', 'bar', 'dog']

您要向该列表添加一个条目

['act', 'bar', 'cat', 'dog']

然后将整个序列序列化为文件,以便您可以在多个会话之间使用相同的数据。

首先要建立您的序列化方法。您选择了以行分隔的纯文本文件。没什么问题,但是如果您正在寻找替代方案,那么使用csv,json或直接序列化到数据库也可能很好。让我们在假设您不会更改序列化架构的前提下继续前进。

很容易从文件中读取

from pathlib import Path
FILEPATH = Path("/Users/ian/Documents/three_character_phrases.txt")

def read_phrases():
    with FILEPATH.open(mode='r') as f:
        return [line.strip() for line in f]

而且写起来也很容易。

# Assume FILEPATH is defined here, and in all future snippets as well.

def write_phrases(phrases):
    with FILEPATH.open(mode='w') as f:
        f.writelines(f'{phrase}\n' for phrase in phrases)
        # this is equivalent to:
        #   text = '\n'.join(phrases)
        #   f.write(text + '\n')

您甚至已经弄清楚了如何让用户输入新值(尽管您的算法可以利用工作来改善最坏的情况。由于您总是要插入已排序的列表,因此bisect stdlib模块可以在此处帮助您获得大型列表的性能。不过,我将其留给其他问题)。

既然您已经成功完成了所有单个步骤,那么让您退缩的唯一一件事就是将它们放在一起。

phrases = read_phrases()

phrase_to_add = input('Please enter the phrase: ').lower()
if phrase_to_add not in phrases:
    phrases.append(phrase_to_add)
    phrases.sort()  # this is, again, not optimal. Look at bisect!

write_phrases(phrases)