2014-02-07 55 views
1

我正在修改一個Python 2腳本,以便它可以工作,Python 3和Python 2向後兼容。下面是代碼片段的簡化示例遇到問題:Python 2和Python 3打印之間的小差異

file = open('test.txt', 'w') 
for item in ['a', 'b', 'c']: 
    print >> file, item, 

print >> file 
file.close() 

據我所知,尾隨逗號會導致空格而不是換行。但是,如果您運行該示例,則會發現情況並非總是如此。在for循環的最後一次迭代中,字母后面沒有空格。這裏是我目前的解決方案,在Python 2和3中獲得相同的結果:

from __future__ import print_function 

file = open('test.txt', 'w') 
items = ['a', 'b', 'c'] 
last_index = len(items) - 1 
for i, item in enumerate(items): 
    end = ' ' if i < last_index else '' 
    print(item, end=end, file=file) 

print(file=file) 
file.close() 

但這是非常醜陋的。我的問題是:是否有更乾淨的方式來做到這一點?注意:我知道這個特殊的例子通過連接可以更容易地解決,但是當我告訴你這種方法不適用於我的情況時,請相信我,因爲在for循環中會發生額外的處理。在回答時,請假定代碼的基本結構必須保持不變。

+0

在循環內部你正在做什麼類型的*額外處理?你可以把這個額外的處理移動到一個函數或生成器,並使用'str.join'寫入返回的迭代。 –

+0

我想將一個發生器與一個連接相結合是一個可行的解決方案。謝謝,我沒有想到這一點。請回答我的問題,我會接受它。 –

+0

我已經取消了我的答案。 –

回答

1

您可以使用str.joincsv模塊。

如果你在列表中的項目進行一些處理,那麼你可以在處理移動到發​​電機,然後加入使用str.join

def gen(x): 
    #do something here 
    #yield something 

with open('file.txt') as f: 
    f.write(' '.join(x for x in gen(items))) 

返回值使用csv模塊:

import csv 
with open('file.txt') as f: 
    writer = csv.writer(f, delimiter=' ') 
    writer.writerow(list(gen(items))) 
+1

加油...至少讀過OP的文字:「[...]注意:我知道這個特殊的例子通過加入更容易解決,[...]」 –

+0

@RicardoCárdenes我已經更新了我的答案後OP的[評論](http://stackoverflow.com/questions/21633594/small-difference-between-print-in-python-2-and-python-3#comment32700642_21633594)。 –

+0

謝謝,我想這可能是我的最佳解決方案。但是,我認爲值得一提的是(爲了向後兼容性),爲了使用,導入被使用:from __future__ import with_statement –