2013-06-21 104 views
0

我試圖讀取一個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進行適當排序。

+0

如果CSV本身是沒有排序和autorunsc沒有對輸出進行排序的選項,您必須閱讀整個文件,然後在Python中進行排序。 – Endophage

+0

這就是我現在要做的,看到上面的代碼,但我得到的結果是按月排序。我期待像excel那樣通過最新的方式獲得它。 – user2292661

+0

沒有真正得到這個問題。日期/時間字段是CSV中的哪一列?如果是這樣,那應該是直截了當的。一行一行地讀取CSV文件('文件名).readlines()'中的行),以逗號分隔每一行('line.split(',')')以創建一個字符串列表。您現在可以將日期/時間列轉換爲'datetime'字段並使用'sorted'。 – Nik

回答

1

好吧,沒有完全理解之前發生了什麼。你的問題是你的「日期」仍然是字符串,並按照這樣排序。我猜你的日期格式是月/日/年(美國日期樣式),你說它按月排序。您只需將日期解析爲日期時間對象即可解決排序問題。

# add this import at the top of your file 
from datetime import datetime 

# replace your current call to sorted with: 
s = sorted(csv.reader(sr), key=lambda x:datetime.strptime(x[0],"%m/%d/%Y"), reverse=True)) 
+0

我以前看過此選項,但是如何跳過列的名稱?例如,autorunsc爲每個列生成帶有標題的csv文件。第一列的名稱爲「時間」,所以如果我按照上面的建議進行操作,則它會返回並因爲讀取「時間」的值而給我一個錯誤,因爲它是該列的第一個值。如何跳過該值並專注於實際的日期/時間值? – user2292661

+0

@ user2292661因此在lambda中,'x [0]'只引用行中的第一列。只需將0替換爲包含日期的列即可。如果您可以從csv提供一個樣本行,這將對您有很大幫助。我只是跟0一起去,因爲你使用'itemgetter(0)' – Endophage

0

您可以使用大熊貓模塊和to_datetime()方法。

代碼:

import pandas as pd 

data = pd.read_csv('mycsv.csv') 
data['Time'] = pd.to_datetime(data['Time'], format="%m/%d/%Y %H:%M") 

data = data.sort_values(by='Time', ascending=False) 
print(data.to_csv(index=False)) 

輸入: mycsv.csv

Time, Field 
6/23/2011 14:23, ABC 
5/25/2006 1:14, XYZ 
4/4/2003 22:10, PQR 
4/17/2006 11:11,GHI 
, 0 
, 1 
6/10/2013 9:30, 2 
6/23/2013 10:25, 3 

輸出:

Time, Field 
2013-06-23 10:25:00, 3 
2013-06-10 09:30:00, 2 
2011-06-23 14:23:00, ABC 
2006-05-25 01:14:00, XYZ 
2006-04-17 11:11:00,GHI 
2003-04-04 22:10:00, PQR 
, 0 
, 1 
相關問題