2017-03-17 42 views
0

我有一個過程,檢查新的數據,如果它發現任何,寫出到一個文件。我想有一個過程,將文件加載到Amazon S3然後Redshift。完全有可能,甚至有可能有時不會有新的數據返回。如果沒有數據寫入文件,我想找到一種Pythonic方法來避免加載到S3/Redshift。處理可能爲空的gzip文件的大部分pythonic方法?

由於我的代碼大量使用generators,如果返回任何數據,我沒有提前知道的方法。這裏是代碼塊:

with gzip.open(outfile, 'wt') as outf: 
     writer = DictWriter(
      f=outf, 
      fieldnames=fieldnames, 
      extrasaction='ignore', 
      delimiter='|', 
      escapechar='\\' 
     ) 
     ...attempt to pull data 
if stat(outfile).st_size > 0: 
    mu.load_to_rs(
      outfile=outfile, 
      s3_path='github_scripts/github_commits', 
      table_name=table, 
      truncate=True # change for prod 
     ) 
else: 
    logger.info('The load file size was 0 bytes: terminating.') 

正如你所看到的,我試圖檢查該文件的os.stat.st_size,但gzip PED文件不是0字節。什麼是處理這類問題的最Python方法?

+0

如果文件是空的(儘管gzip不是0字節),它不應該花費太多的處理時間來窺探文件,看看有多少字節/行在裏面...我不知道你還有什麼其他的東西, d知道它是空的,除非所有gzipped空文件的大小相同(非零),然後檢查該大小。 –

回答

1

讓我們做一個空gzip文件,看看它是什麼樣子:

In [3]: import gzip 

In [12]: with gzip.open('empty.gz', 'wb') as f: 
    ...:  f.write(b'') 
    ...:  

In [13]: with open('empty.gz', 'rb') as f: 
    ...:  contents_empty = f.read() 
    ...:  

In [14]: contents_empty 
Out[14]: b'\x1f\x8b\x08\x08,P\xccX\x02\xffempty\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00' 

In [15]: len(contents_empty) - len('empty') 
Out[15]: 21 

所以空g​​zip文件的大小爲21個字節加上文件的名稱不帶擴展名的長度。

編輯:根據file format specification,文件中的最後四個字節包含原始數據模2^32的大小。

In [19]: contents_a[-4:], contents_b[-4:] 
Out[19]: (b'\x00\x04\x00\x00', b'\x00\x04\x00\x00') 

In [21]: '{:04x}'.format(1024) 
Out[21]: '0400' 

因此,如果你以二進制模式打開的文件,你可以從年底到seek四個字節,然後讀四個字節。這也會給你數據的大小。

+0

我最終只寫了一個小函數來打開gzip文件並檢查內容,但這同樣有效! – flybonzai

相關問題