我試圖讀取一個csv文件,該文件是運行Autoruns autorunsc命令行(即,autorunsc -a -m -c> mycsv.csv)並對其進行排序的結果在某種程度上,我可以像在Excel中那樣獲得最新的日期/時間。如何按最新時間對csv文件列進行排序
到目前爲止我想通了,如何將它轉換成csv文件沒有編碼錯誤在使用Recoder蟒類,它重新編碼爲UTF 8
import sys
import csv
import operator
import codecs
class Recoder(object):
def __init__(self, stream, decoder, encoder, eol='\r\n'):
self._stream = stream
self._decoder = decoder if isinstance(decoder, codecs.IncrementalDecoder) else codecs.getincrementaldecoder(decoder)()
self._encoder = encoder if isinstance(encoder, codecs.IncrementalEncoder) else codecs.getincrementalencoder(encoder)()
self._buf = ''
self._eol = eol
self._reachedEof = False
def read(self, size=None):
r = self._stream.read(size)
raw = self._decoder.decode(r, size is None)
return self._encoder.encode(raw)
def __iter__(self):
return self
def __next__(self):
if self._reachedEof:
raise StopIteration()
while True:
line,eol,rest = self._buf.partition(self._eol)
if eol == self._eol:
self._buf = rest
return self._encoder.encode(line + eol)
raw = self._stream.read(1024)
if raw == '':
self._decoder.decode(b'', True)
self._reachedEof = True
return self._encoder.encode(self._buf)
self._buf += self._decoder.decode(raw)
next = __next__
def close(self):
return self._stream.close()
writer = open('mycsv1.csv, 'wb')
f = open('mycsv.csv','rb'):
sr = Recoder(f, 'utf-16', 'utf-8')
s = sorted(csv.reader(sr), key=operator.itemgetter(0), reverse=True))
for row in s:
print >> writer, row[0], ",", row[1], "," row[2]
問題讀它作爲UTF-16是這隻從它的外觀按月排序。假設我在2010年,2011年,2012年有1-6個月的參賽作品。
它會按月僅對它進行排序,不包括時間或日期,以便我只獲取最新日期。相反,我得到1/1/2010,1/1/2011,1/1/2012,2/1/2010,2/1/2011,2/1/2012。
如果我在excel中進行排序,它會首先給我最新的日期/時間,如果它是基於6月份的這個月(2012年6月1日,2012年5月1日,4/1/2012等)任何關於如何使用python完成此任務的幫助,我都非常感謝。
UPDATE
我一起工作的樣本數據是從autorunsc它被格式化爲utf8後。 CSV中的數據應如下所示:
Time, Entry Location, Entry, Enabled, Category, Description, Publisher, Launch String
6/23/2011 14:23, HKLM\System\CurrentControlSet\Services, JavaQuickStarterService, enabled, Services, Prefetches JRE files for faster startup, Oracle Corporation, C:\Program Files\java, C:\Program Files\Java\jre\blah
5/25/2006 1:14,,,,,,,,,
4/4/2003 22:10,,,,,,,,,
4/17/2006 11:11,,,,,,,,
0,,,,,,,,, (Some of the entries do not have date values and are null or blank.
6/10/2013 9:30,,,,,,,,,
6/23/2013 10:25,,,,,,,,,
etc
大多數這些條目都有值,但我不想複製和粘貼所有內容。我基本上想要像最新日期/時間一樣排列日期,就像excel一樣。下面提到的lambda選項錯誤,因爲它首先從列中的「時間」中讀取。我想弄清楚如何跳過第一行並在其他日期/時間值上使用lambda進行適當排序。
如果CSV本身是沒有排序和autorunsc沒有對輸出進行排序的選項,您必須閱讀整個文件,然後在Python中進行排序。 – Endophage
這就是我現在要做的,看到上面的代碼,但我得到的結果是按月排序。我期待像excel那樣通過最新的方式獲得它。 – user2292661
沒有真正得到這個問題。日期/時間字段是CSV中的哪一列?如果是這樣,那應該是直截了當的。一行一行地讀取CSV文件('文件名).readlines()'中的行),以逗號分隔每一行('line.split(',')')以創建一個字符串列表。您現在可以將日期/時間列轉換爲'datetime'字段並使用'sorted'。 – Nik