2013-02-12 295 views
1

因此,我正在導入名稱列表 例如創建for循環命名輸出文件Python

文本文件將包括:

Eleen 
Josh 
Robert 
Nastaran 
Miles 

my_list = ['Eleen','Josh','Robert','Nastaran','Miles'] 

那麼我分配每個名字的清單,我想要寫在列表中的每個名稱的新Excel文件。

#1. Is there anyway I can create a for loop where on the line: 
temp = os.path.join(dir,'...'.xls') 
_________________________ 
def high_throughput(names): 
    import os 
    import re 


# Reading file 

in_file=open(names,'r') 
dir,file=os.path.split(names) 
temp = os.path.join(dir,'***this is where i want to put a for loop 
for each name in the input list of names***.xls') 
out_file=open(temp,'w') 

data = [] 

for line in in_file: 
    data.append(line) 

in_file.close() 
+2

那麼你的問題是什麼?另外,請儘量減少代碼示例。 – millimoose 2013-02-12 19:23:27

+0

爲什麼你將每個名稱分配給全局?然而,無論如何,爲什麼你這樣做,你仍然擁有'my_list',那麼爲什麼不直接使用'作爲my_list中的名字:'? – abarnert 2013-02-12 19:24:18

+0

我改變了一點點。我爲示例顯示的代碼有我的區域,我在其中創建名稱列表,並在文件中逐行提取數據。我想這個名爲「數據」的列表將等於「my_list」 – 2013-02-12 19:27:39

回答

0

我還是不知道你想做什麼(並以「不知道」,我的意思是「徹底難倒了」),但我想我可以解釋一些你做錯了什麼,怎麼做是正確的:

in_file=open(names,'r') 
dir,file=os.path.split(names) 
temp = os.path.join(dir,'***this is where i want to put a for loop 
for each name in the input list of names***.xls') 

在這一點上,你不名稱的輸入列表。這就是你從in_file閱讀的內容,你還沒有閱讀。稍後,您將讀取名爲data的文件,然後您可以使用它們。所以:

in_file=open(names,'r') 
dir,file=os.path.split(names) 

data = [] 

for line in in_file: 
    data.append(line) 

in_file.close() 

for name in data: 
    temp = os.path.join(dir, '{}.xls'.format(name)) 
    out_file=open(temp,'w') 

請注意,我把for循環放在函數調用之外,因爲你必須這樣做。這是一件好事,因爲你可能想要在該循環內打開每個路徑(並對每個文件執行操作),而不是打開由文件循環構成的單個路徑。

但是,如果您不堅持使用for循環,那麼您可能會更接近您正在尋找的內容:列表理解。你有一個名字列表。您可以使用它來構建路徑列表。然後你可以用它來建立一個打開的文件列表。就像這樣:

paths = [os.path.join(dir, '{}.xls'.format(name)) for name in data] 
out_files = [open(path, 'w') for path in paths] 

然後,以後,你已經建立了你想要寫的所有文件後的字符串,你可以這樣做:

for out_file in out_files: 
    out_file.write(stuff) 

然而,這類型的奇怪的設計。主要是因爲你必須關閉每個文件。他們可能垃圾收集自動關閉,即使他們不,他們可能得到刷新......但除非你幸運,所有你寫的數據只是坐在內存中的緩衝區,永遠不會寫到磁盤。通常你不想編寫依靠幸運的程序。所以,你想關閉你的文件。有了這個設計,你必須做一些事情,如:

for out_file in out_files: 
    out_file.close() 

這可能是一個簡單得多回去一個大圈我擺在首位的建議,所以你可以這樣做:

for name in data: 
    temp = os.path.join(dir, '{}.xls'.format(name)) 
    out_file=open(temp,'w') 
    out_file.write(stuff) 
    out_file.close() 

,或者甚至更好:

for name in data: 
    temp = os.path.join(dir, '{}.xls'.format(name)) 
    with open(temp,'w') as out_file: 
     out_file.write(stuff) 

一些更多的意見,而我們在這裏......

首先,你真正的不應該試圖手動生成.xls文件。您可以使用像openpyxl這樣的庫。或者您可以創建.csv文件 - 它們可以很容易地使用Python內置的csv庫創建,Excel可以像處理.xls文件一樣輕鬆地處理它們。或者,您可以使用win32compywinauto來控制Excel並使其創建您的文件。實際上,任何事情都比試圖用手產生它們更好。其次,您可以編寫for line in in_file:這一事實意味着in_file是某種類型的線序。所以,如果你想要做的是將其轉換爲線的list,你可以一步到位:

data = list(in_file) 

不過說真的,你想要的唯一原因此列表中的第一個地方是這樣你就可以稍後再循環,創建輸出文件,對吧?那麼爲什麼不拖延,並首先在文件中循環播放?

無論您如何生成輸出內容,請先執行此操作。然後用文件名列表和文件循環遍歷文件。就像這樣:

stuff = # whatever you were doing later, in the code you haven't shown 

dir = os.path.dirname(names) 
with open(names, 'r') as in_file: 
    for line in in_file: 
     temp = os.path.join(dir, '{}.xls'.format(line)) 
     with open(temp, 'w') as out_file: 
      out_file.write(stuff) 

,取代所有示例代碼(除命名爲high_throughput該功能導入本地一些模塊,然後什麼都不做)。

0

看看openpyxl,特別是如果你需要創建.xlsx文件。以下示例假定Excel工作簿創建爲空白。

from openpyxl import Workbook 
names = ['Eleen','Josh','Robert','Nastaran','Miles'] 
for name in names: 
    wb = Workbook() 
    wb.save('{0}.xlsx'.format(name)) 
0

試試這個:

in_file=open(names,'r') 
dir,file=os.path.split(names) 

for name in in_file: 
    temp = os.path.join(dir, name + '.xls') 
    with open(temp,'w') as out_file: 
     # write data to out_file