按键对文件排序

时间:2019-02-11 13:43:41

标签: python python-3.x

我正在学习Python 3,但在完成此任务时遇到了问题。它在每个新行上都提供了一个带有字符串的文件。我必须通过位于第一个连字符和第二个连字符之间的字符串对内容进行排序,然后将排序后的内容写入另一个文件中。这是我到目前为止尝试过的,但没有得到解决:

def sort_keys(path, input, output):
list = []
with open(path+'\\'+input, 'r') as f:
    for line in f:
        if line.count('-') >= 1:
            list.append(line)
sorted(list, key = lambda s: s.split("-")[1])
with open(path + "\\"+ output, 'w') as o:
    for line in list:
        o.write(line)

sort_keys("C:\\Users\\Daniel\\Desktop", "sample.txt", "results.txt")

这是输入文件:https://pastebin.com/j8r8fZP6

  • 问题1:我在排序时出了什么问题?我已经用它对最后一个字母上的句子的单词进行了排序,并且效果很好,但是这里不知道我在做什么错
  • 问题2:我觉得将输入文件的内容写在列表中,对列表进行排序,然后在后面写下内容不是很有效。这样做的“ pythonic”方法是什么?
  • 问题3:您知道学习使用Python 3中的文件+文件夹有什么好的练习吗?

亲切的问候

2 个答案:

答案 0 :(得分:1)

您的排序很好。问题是sorted()返回一个列表,而不是更改提供的列表。使用列表推导来读取文件也容易得多:

def sort_keys(path, infile, outfile):
    with open(path+'\\'+infile, 'r') as f:
        inputlines = [line.strip() for line in f.readlines() if "-" in line]

    outputlines = sorted(inputlines, key=lambda s: s.split("-")[1])
    with open(path + "\\" + outfile, 'w') as o:
        for line in outputlines:
            o.write(line + "\n")


sort_keys("C:\\Users\\Daniel\\Desktop", "sample.txt", "results.txt")

为了清晰起见,我还更改了一些变量名。 编辑:我知道有进行排序(list.sort(x))的更简单的方法,但是这种方法对我来说似乎更具可读性。

答案 1 :(得分:0)

首先,您的数据有几行没有连字符。那是错字吗?还是您需要处理这些问题?如果不是拼写错误,并且这些行应该是数据的一部分,应该如何处理?

我将假设这些行是错别字,暂时将其忽略。

第二,您需要返回整行吗?但是每一行都按连字符之间的第二组字符排序吗?如果是这样...

首先,读入文件:

f = open('./text.txt', 'r')

这里有几种方法,但让我们稍微整理一下文件内容并创建一个列表对象:

l = [i.replace("\n","") for i in f]

这将创建一个列表l,其中所有换行符均已删除。创建列表的这种特定方式称为列表理解。您可以使用以下代码执行完全相同的操作:

l = []
for i in f:
    l.append(i.replace("\n","")

现在,我们创建一个字典,将键作为第二组,将值作为整行。再说一遍,有些行没有连字符,所以我们现在只用一个简单的try / except块跳过它们:

d = {}
for i in l:
    try:
        d[i.split("-")[1]] = i
    except IndexError:
        pass

现在,这里的事情可能会有些棘手。这取决于您要如何解决该问题。字典在python中本质上是未排序的,因此没有一种对字典进行简单排序的好方法。一种方法(不一定是BEST方法)是创建字典键的排序列表:

s = sorted([k for k, v in d.items()])

同样,我在这里使用了列表理解功能,但是您可以在此处重写该行以执行完全相同的操作:

s = []
for k, v in d.items():
    s.append(k)
s = sorted(s)

现在,我们可以使用已排序的列表遍历字典,将字典写回到文件中。要了解我的意思,让我们使用排序列表作为键,一次将字典中的一个值打印出来:

for i in s:
    print(d[i])

但是我们现在不打印,而是将行附加到文件中:

o = open('./out.txt', 'a')
for i in s:
    o.write(d[i] + "\n")

取决于您的系统和格式,您可能需要也可能不需要+ "\n"部分。另请注意,您要使用'a'而不是'w',因为您一次要追加一行,如果使用'w',则文件将仅是列表的最后一项。 / p>