Saya memiliki daftar panjang string, dipisahkan dengan koma (pada dasarnya, file csv membaca baris demi baris ke string, tidak melakukan pemisahan pada pemisah):

lines[0] = "2017-08-01 13:45:58,mytext,mytext2,mytext3,etc"
lines[1] = "2017-08-01 15:45:58,mytextx,mytext2x,mytext3x,etcx"
lines[2] = "2017-08-01 19:45:58,mytexty,mytext2y,mytext3y,etcy"
lines[3] = "..."

Dari posting ini saya tahu bahwa kode berikut akan berfungsi jika baris saya hanya terdiri dari tanggal:

lines_sorted = sorted(lines, key=lambda x: datetime.datetime.strptime(lines, '%Y-%m-%d %H:%M:%S'))

Saya pikir saya bisa menggunakan partition untuk mengekstrak tupel dari semua baris dalam file, di mana elemen pertama berisi datetimepart:

for unsortedFile in glob('*.txt'):
    with open(unsortedFile, 'r') as file:
        lines = [line.rstrip('\n').partition(',') for line in file]
        lines_sorted = sorted(lines, key=lambda x: datetime.datetime.strptime(lines[0], '%Y-%m-%d %H:%M:%S'))

..tapi tentu saja, ini tidak berfungsi "TypeError: indeks daftar harus bilangan bulat atau irisan, bukan str" karena lines[0] tidak merujuk pada tuple pertama tetapi item pertama dalam daftar baris. Saya juga mencoba menggunakan .strptime(lines[lambda][0], '%Y-%m-%d %H:%M:%S')) tetapi tidak berhasil.

Saya tahu saya melakukan sesuatu yang salah .. bantuan apa pun sangat dihargai.

[sunting] Inilah jawabannya, dari komentar ramah di bawah ini:

for unsortedFile in glob('*.txt'):
    with open(unsortedFile, 'r', encoding="utf8") as file: #read each unsorted file to lines (list)
        lines = [line.rstrip('\n') for line in file]
        lines_sorted = sorted(lines,
                    key=lambda x: x.split(',', maxsplit=1)[0]
                    )
        lines.clear()
    with open(unsortedFile,'w', encoding="utf8") as file: #overwrite file
        for line in lines_sorted:
            file.write(line + '\n')
0
Alex 18 Agustus 2017, 12:17

2 jawaban

Jawaban Terbaik

Pada dasarnya argumen key dari fungsi sorted harus berupa fungsi yang mengambil item daftar dan mengembalikan objek yang sebanding.
sorted akan mengurutkan daftar menurut gambar item daftar dengan fungsi ini, bukan item itu sendiri.

Berikut adalah contoh, yang merupakan campuran dari solusi yang disarankan:

lines_sorted = sorted(lines,
                      key=lambda x: x.split(',', maxsplit=1)[0]
                     )

Dengan kode ini, setiap item yang memiliki tanggal yang sama akan dianggap sama oleh sorted.

1
User9123 18 Agustus 2017, 09:42

Ambil saja elemen pertama dari split:

lines_sorted = sorted(
    lines, 
    key=lambda x: datetime.datetime.strptime(x.split(",")[0], 
                                            '%Y-%m-%d %H:%M:%S'
))

Dengan cara ini Anda hanya mengambil datetime untuk penyortiran sambil menyimpan data asli.

2
Netwave 18 Agustus 2017, 09:36