簡體   English   中英

在Python中編寫固定寬度,空格分隔的CSV輸出

[英]writing fixed width, space delimited CSV output in Python

我想使用Python的csv編寫器編寫固定寬度,空格分隔和最低引用的CSV文件。 輸出的一個例子:

item1           item2  
"next item1"    "next item2"
anotheritem1    anotheritem2  

如果我使用

writer.writerow((“{0:15s}”。format(item1),“{0:15s}”。format(item2)))
...

然后,使用空格分隔符,由於項目格式的尾隨空格,因此添加了引號或轉義(取決於csv.QUOTE_ *常量),格式化將被破壞:

"item1          " "item2          "
"next item1     " "next item2     "
"anotheritem1   " "anotheritem2   "

當然,我可以自己格式化所有內容:

writer.writerow((“{0:15s} {1:15s}”。format(item1,item2)))

但是使用csv編寫器並沒有多大意義。 此外,當空間嵌入到項目中並且應該使用引用/轉義時,我必須手動整理這些情況。 換句話說,似乎我需要一個(不存在的)“QUOTE_ABSOLUTELYMINIMAL”csv常量,它將充當“QUOTE_MINIMAL”,但也會忽略尾隨空格。

有沒有辦法實現“QUOTE_ABSOLUTELYMINIMAL”行為或使用Python的CSV模塊獲得固定寬度,空格分隔的CSV輸出的另一種方法?

我想在CSV文件中使用固定寬度功能的原因是更好的可讀性。 因此,它將被處理為CSV以供讀取和寫入,但由於列結構而更易讀。 讀取不是問題,因為csv skipinitialspace選項負責忽略額外的空格。 令我驚訝的是,寫作似乎是一個問題......

編輯:我得出結論,使用當前的csv插件是不可能實現的。 它不是一個內置選項,我看不出任何合理的方法如何手動實現它,因為似乎沒有辦法由Python的csv編寫器編寫額外的分隔符而不引用或轉義它們。 因此,我可能要編寫自己的csv編寫器。

您遇到的基本問題是csv和固定格式基本上是數據存儲的對立視圖。 讓它們協同工作並不常見。 此外,如果您對其中包含空格的項目只有引號,它將會拋棄這些行上的對齊:

testing     "rather hmm "
strange     "ways to    "
"store some " "csv data   "
testing     testing    

重新讀取數據會導致錯誤的結果:

'testing' 'rather hmm '
'strange' 'ways to    '
'store some ' 'csv data   '
'testing' 'testing' ''

注意最后一行末尾的額外字段。 鑒於這些問題,我會以你的例子為例

"item1          " "item2          "
"next item1     " "next item2     "
"anotheritem1   " "anotheritem2   "

我發現它非常易讀,很容易使用現有的csv庫生成,並在讀回時正確解析。這是我用來生成它的代碼:

import csv

class SpaceCsv(csv.Dialect):
    "csv format for exporting tables"
    delimiter = None
    doublequote = True
    escapechar = None
    lineterminator = '\n'
    quotechar = '"'
    skipinitialspace = True
    quoting = csv.QUOTE_MINIMAL
csv.register_dialect('space', SpaceCsv)

data = (
        ('testing    ', 'rather hmm '),
        ('strange    ', 'ways to    '),
        ('store some ', 'csv data   '),
        ('testing    ', 'testing    '),

temp = open(r'c:\tmp\fixed.csv', 'w')
writer = csv.writer(temp, dialect='space')
for row in data:
    writer.writerow(row)
temp.close()

當然,您需要將所有數據填充到相同的長度,或者在獲取執行所有這些操作的函數之前,或者在函數本身中填充。 哦,如果你有數字數據,你也必須為它做出填充限制。

這對你有什么用? 我想你真的只缺少csv.QUOTE_NONE常量。

import csv
csv.register_dialect('spacedelimitedfixedwidth', delimiter=' ', quoting=csv.QUOTE_NONE)
with open('crappymainframe.out', 'rb') as f:
    reader = csv.reader(f, 'spacedelimitedfixedwidth')

這是對csv模塊文檔底部的unixpwd方言示例的修改。

這個活動狀態配方顯示了如何在python中輸出表格化數據: http//code.activestate.com/recipes/267662-table-indentation/

您可以從該示例中收集足夠的內容來做您想做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM