2017-08-18 11 views
0

私は文字列の長いリストをカンマで区切ります(基本的にcsvファイルは文字列に1行ずつ読み込み、split(datetime)の最初の要素に基づいて文字列のリストを並べ替えます

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

を私はファイル内のすべての行からタプルを抽出するためにpartitionを使用と考えていた:

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] = "..." 

ポストthisから私は私の行のみ日付時刻で構成されます場合は、次のコードは動作する必要があることを知っています最初の要素には日付timepart:

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')) 

..butはもちろん、これは動作しません:lines[0]は最初のタプルが、ライン・リストの最初の項目を参照されていないため、「TypeError例外リストインデックスがstrをない、整数またはスライスでなければなりません」。私も.strptime(lines[lambda][0], '%Y-%m-%d %H:%M:%S'))を使ってみましたが、どちらもうまくいきません。

私は何か間違っていることを知っています..どんな助けも大歓迎です。

[編集] ここでの答えは以下の友好のコメントから、です:ちょうどsplitの最初の要素を取る

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') 
+2

'lines [0]'を 'x [0]'に置き換えてください。 –

+0

は、 'x.split( '、')[0]'(または 'x.partition( '、')[0]'でなければなりません) – User9123

+2

あなたの文字列と日付のフォーマットを考えると、それらをソートするために 'datetime'オブジェクトに;通常の文字列の並び替えでも同じ結果が得られるので、 'key'パラメータを' sort'にドロップできます。 – jdehesa

答えて

1

基本的に関数の引数keyは、リストアイテムを取り、同等のオブジェクトを返す関数でなければなりません。
sortedは、アイテム自体ではなく、この機能によってリストアイテムのイメージに従ってリストをソートします。ここ

が提案ソリューションの組み合わせである、一例であり、このコードで

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

、同じ日付を持つすべての項目はsortedによって等しいと見なされます。

+0

ありがとう、User9123、これは本当にfastedアプローチのようです(datetimeconversionなしで、パーティションの代わりにmaxsplit = 1を使用します)。私は正しい答えとしてあなたの名前を追加しました。 – Alex

2

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

あなただけのために日時を取っている。この方法元のデータを保持したままソートします。

関連する問題