如何在字符的最后一个实例之后对文本文件进行排序?
How do I sort a text file after the last instance of a character?
目标:根据最后一个斜杠后出现的字符按字母顺序对文本文件进行排序。请注意,在最后一个斜线之前有随机数。
文本文件的内容:
https://www.website.com/1939332/delta.html
https://www.website.com/2237243/alpha.html
https://www.website.com/1242174/zeta.html
https://www.website.com/1839352/charlie.html
期望的输出:
https://www.website.com/2237243/alpha.html
https://www.website.com/1839352/charlie.html
https://www.website.com/1939332/delta.html
https://www.website.com/1242174/zeta.html
代码尝试:
i = 0
for line in open("test.txt").readlines(): #reading text file
List = line.rsplit('/', 1) #splits by final slash and gives me 4 lists
dct = {list[i]:list[i+1]} #tried to use a dictionary
sorted_dict=sorted(dct.items()) #sort the dictionary
textfile = open("test.txt", "w")
for element in sorted_dict:
textfile.write(element + "\n")
textfile.close()
代码无效。
我会将另一个 key
函数传递给 sorted
函数。例如:
with open('test.txt', 'r') as f:
lines = f.readlines()
lines = sorted(lines, key=lambda line: line.split('/')[-1])
with open('test.txt', 'w') as f:
f.writelines(lines)
有关关键功能的更详细说明,请参阅 here。
def sortFiles(item):
return item.split("/")[-1]
FILENAME = "test.txt"
contents = [line for line in open(FILENAME, "r").readlines() if line.strip()]
contents.sort(key=sortFiles)
with open(FILENAME, "w") as outfile:
outfile.writelines(contents)
在你 运行 这个之前,我假设 you have a newline at the end of your test.txt. 这将解决“合并第二行和第三行”的问题。
如果你真的想用字典:
dct = {}
i=0
with open("test.txt") as textfile:
for line in textfile.readlines():
mylist = line.rsplit('/',1)
dct[mylist[i]] = mylist[i+1]
sorted_dict=sorted(dct.items(), key=lambda item: item[1])
with open("test.txt", "w") as textfile:
for element in sorted_dict:
textfile.write(element[i] + '/' +element[i+1])
你做错了什么
在第一行中,您将变量命名为 List
,在第二行中,您使用 list
.
访问它
List = line.rsplit('/', 1)
dct = {list[i]:list[i+1]}
变量名区分大小写,因此您每次都需要使用相同的大写字母。此外,Python 已经有一个 built-in list
class。它可以被覆盖,但我不建议将变量命名为 list
、dict
等
( list[i]
实际上只会生成一个 types.GenericAlias
对象,这是一个类型提示,完全不同于列表,根本不是你想要的。)
你也写了
dct = {list[i]:list[i+1]}
在每个循环迭代中重复创建一个 new 字典,覆盖之前存储在 dct
中的任何内容。您应该改为在循环之前创建一个空字典,并在每次要更新它时为其键分配值,就像我所做的那样。
您在循环的每次迭代中调用 sort
;你应该只在循环完成后调用一次。毕竟,您只想对字典进行一次排序。
你还 open
文件两次,虽然你最后关闭了它,但我建议像我一样使用上下文管理器和 with
语句,这样文件关闭是自动处理。
我的代码
sorted(dct.items(), key=lambda item: item[1])
表示 sorted()
函数使用 item
元组(字典项)中的第二个元素作为 'metric' 进行排序的依据。
`textfile.write(element[i] + '/' +element[i+1])`
是必要的,因为当您执行 rsplit('/',1)
时,您删除了数据中的 /
;您需要将它们添加回去并在 write
之前从 element
元组重建字符串。
您不需要 textfile.write
中的 + \n
,因为 readlines()
保留了 \n
。这就是为什么你应该用换行符结束文本文件:这样你就不必以不同的方式对待最后一行。
目标:根据最后一个斜杠后出现的字符按字母顺序对文本文件进行排序。请注意,在最后一个斜线之前有随机数。
文本文件的内容:
https://www.website.com/1939332/delta.html
https://www.website.com/2237243/alpha.html
https://www.website.com/1242174/zeta.html
https://www.website.com/1839352/charlie.html
期望的输出:
https://www.website.com/2237243/alpha.html
https://www.website.com/1839352/charlie.html
https://www.website.com/1939332/delta.html
https://www.website.com/1242174/zeta.html
代码尝试:
i = 0
for line in open("test.txt").readlines(): #reading text file
List = line.rsplit('/', 1) #splits by final slash and gives me 4 lists
dct = {list[i]:list[i+1]} #tried to use a dictionary
sorted_dict=sorted(dct.items()) #sort the dictionary
textfile = open("test.txt", "w")
for element in sorted_dict:
textfile.write(element + "\n")
textfile.close()
代码无效。
我会将另一个 key
函数传递给 sorted
函数。例如:
with open('test.txt', 'r') as f:
lines = f.readlines()
lines = sorted(lines, key=lambda line: line.split('/')[-1])
with open('test.txt', 'w') as f:
f.writelines(lines)
有关关键功能的更详细说明,请参阅 here。
def sortFiles(item):
return item.split("/")[-1]
FILENAME = "test.txt"
contents = [line for line in open(FILENAME, "r").readlines() if line.strip()]
contents.sort(key=sortFiles)
with open(FILENAME, "w") as outfile:
outfile.writelines(contents)
在你 运行 这个之前,我假设 you have a newline at the end of your test.txt. 这将解决“合并第二行和第三行”的问题。
如果你真的想用字典:
dct = {}
i=0
with open("test.txt") as textfile:
for line in textfile.readlines():
mylist = line.rsplit('/',1)
dct[mylist[i]] = mylist[i+1]
sorted_dict=sorted(dct.items(), key=lambda item: item[1])
with open("test.txt", "w") as textfile:
for element in sorted_dict:
textfile.write(element[i] + '/' +element[i+1])
你做错了什么
在第一行中,您将变量命名为 List
,在第二行中,您使用 list
.
List = line.rsplit('/', 1)
dct = {list[i]:list[i+1]}
变量名区分大小写,因此您每次都需要使用相同的大写字母。此外,Python 已经有一个 built-in list
class。它可以被覆盖,但我不建议将变量命名为 list
、dict
等
( list[i]
实际上只会生成一个 types.GenericAlias
对象,这是一个类型提示,完全不同于列表,根本不是你想要的。)
你也写了
dct = {list[i]:list[i+1]}
在每个循环迭代中重复创建一个 new 字典,覆盖之前存储在 dct
中的任何内容。您应该改为在循环之前创建一个空字典,并在每次要更新它时为其键分配值,就像我所做的那样。
您在循环的每次迭代中调用 sort
;你应该只在循环完成后调用一次。毕竟,您只想对字典进行一次排序。
你还 open
文件两次,虽然你最后关闭了它,但我建议像我一样使用上下文管理器和 with
语句,这样文件关闭是自动处理。
我的代码
sorted(dct.items(), key=lambda item: item[1])
表示 sorted()
函数使用 item
元组(字典项)中的第二个元素作为 'metric' 进行排序的依据。
`textfile.write(element[i] + '/' +element[i+1])`
是必要的,因为当您执行 rsplit('/',1)
时,您删除了数据中的 /
;您需要将它们添加回去并在 write
之前从 element
元组重建字符串。
您不需要 textfile.write
中的 + \n
,因为 readlines()
保留了 \n
。这就是为什么你应该用换行符结束文本文件:这样你就不必以不同的方式对待最后一行。