2010-02-18 24 views
9

Tôi có một file text với các dòng như thế này:dòng loại trong tập tin văn bản, nhưng chỉ sử dụng các nhân vật N đầu tiên

2010-02-18 11:46:46.1287 bla 
2010-02-18 11:46:46.1333 foo 
2010-02-18 11:46:46.1333 bar 
2010-02-18 11:46:46.1467 bla 

Một sắp xếp đơn giản sẽ trao đổi dòng 2 và 3 (thanh đứng trước foo), nhưng Tôi muốn giữ các dòng (có cùng ngày/giờ) theo thứ tự ban đầu của chúng.

Tôi có thể làm điều này bằng Python bằng cách nào?

Câu hỏi bổ sung: GNU có thể sắp xếp cũng làm điều này không?

+0

'sắp xếp -s-k 1,2 data.txt' – jfs

Trả lời

24
sorted(array, key=lambda x:x[:24]) 

Ví dụ:

>>> a = ["wxyz", "abce", "abcd", "bcde"] 
>>> sorted(a) 
['abcd', 'abce', 'bcde', 'wxyz'] 
>>> sorted(a, key=lambda x:x[:3]) 
['abce', 'abcd', 'bcde', 'wxyz'] 
+4

Tham khảo: http://docs.python.org/library/functions.html#sorted –

+0

Lưu ý rằng điều này sắp xếp ngày/giờ dưới dạng chuỗi. Điều đó xảy ra để làm việc trong trường hợp này. Nếu không, bạn có thể cần sử dụng chức năng khóa thông minh hơn, thực sự phân tích ngày/giờ. –

4

Việc xây dựng trong loại ổn định, do đó bạn có các giá trị một cách hiệu quả-bằng ở lại để theo mặc định.

import operator 

with open('filename', 'r') as f: 
    sorted_lines = sorted(f, key=operator.itemgetter(slice(0, 24))) 

Tại thời điểm này sorted_lines sẽ là danh sách các dòng được sắp xếp. Để thay thế tệp cũ, hãy tạo một tệp mới, gọi new_file.writelines(sorted_lines), sau đó di chuyển tệp mới qua tệp cũ.

+1

+1 để giải thích rằng nó hoạt động vì 'sắp xếp' là ổn định – fortran

+2

' s/slice (24, Không có)/slice (0, 24)/' – jfs

+0

@ J.F. Sebastian, Cảm ơn, tôi đã đọc sai câu hỏi (và nghĩ rằng nó mâu thuẫn với tiêu đề). Ngoài ra, regex của bạn là sai. ;) –

Các vấn đề liên quan