我正在使用python将两个文件合并在一起创建一个新文件,两个文件中的数据在每个字符串的开头都有一个id我想要排序,所以它们的顺序相同,可以是合并。为此,我使用了.sort(),以便它们按照相同的顺序排列,并且注释与细节相匹配。但是,我现在想重新排序它们,以便它们分别为1,2,3,4 ......而不是1,10,100,1000,1001,1002等,但我遇到了困难,因为这个数字是开头的字符串和python不会将字符串的前四个字符转换为整数。如果有任何帮助,它也是制表符分隔文件,id后面的下一条信息就是日期。
任何想法都会受到赞赏,理想情况下我不想导入任何库。
我的代码是:
comments = R'C:\Pythonfile\UFOGB_Comments.txt'
details = R'C:\Pythonfile\UFOGB_Details.txt'
mydest = R'C:\Pythonfile\UFOGB_sorted.txt'
with open(details,'rt') as src:
readdetails = src.readlines()
readdetails.sort()
with open(comments,'rt') as src:
readcomments = src.readlines()
readcomments.sort()
with open(mydest, 'w') as dest:
for i in range(len(readdetails)):
cutcomm = readcomments[i][readcomments[i].find('"'):]
dest.write('{}\t{}'.format(readdetails[i].strip('\n'),cutcomm))
答案 0 :(得分:1)
您可以尝试将第一个字段解析为int:
readdetails.sort(key=lambda x: int(x.split()[0]))
如果所有行都采用一致的格式,这将很有效。
否则使用更复杂的函数作为list.sort()的关键函数,例如:
def extract_id(line):
# do something with line
# and return an integer, or another kind of value
并将其传递给sort函数:
readdetails.sort(key=extract_id)
答案 1 :(得分:0)
我尝试根据您的解释重新创建数据。告诉我这是否正确:
lines = """
123 foobar
1000 foobar
432 foobar
22 foobar
987 foobar
""".strip().split('\n')
print(lines)
lines.sort(key=lambda s: int(s[:4]))
print(lines)
结果:
['123 foobar', '1000 foobar', '432 foobar', '22 foobar', '987 foobar'] # initial
['22 foobar', '123 foobar', '432 foobar', '987 foobar', '1000 foobar'] # final
我认为您的整数id限制为4位,正如您在OP中所说的那样。如果id大小是可变的,您可以简单地替换排序函数:
lines.sort(key=lambda s: int(s.split()[0]))
答案 2 :(得分:0)
如果您的困难与按每个条目的前四个字符对列表排序有关,请尝试https://wiki.python.org/moin/HowTo/Sorting中的此方法:
with open(details,'rt') as src:
read_details = src.readlines()
read_details = sorted(read_details, key=lambda detail: detail[:4])
with open(comments,'rt') as src:
read_comments = src.readlines()
read_comments = sorted(read_comments, key=lambda comment: comment[:4])
我并不完全确定您在最后一部分中尝试实现的目标 - 您在评论和详细信息文件中所拥有的示例,其中包含您希望条目看起来像什么的示例目的地将是有用的。