2016-06-26 422 views
3

我有一個for循環的麻煩。 我不知道發生了什麼,這用於工作,但現在它告訴我「沒有要連接的對象」。儘管excel文件循環做些什麼,並將它們保存到新文件夾python pandas

我想完成兩件事。 我想遍歷文件夾中的所有excel文件。對於每個excel文件,我想刪除2行標題數據(下面的代碼已經這樣做)。

然後我想將每個編輯文件的原始文件名保存在一個新文件夾中。而且,保存一個新文件,其中每個編輯文件的所有數據都附加在一起。

我以爲我有附加正確,但由於某種原因,它不再工作。

import os 
import pandas as pd 
import numpy as np 

from pandas import Series, DataFrame 

appended_data = [] 

path = 'C:\Test\TestRawFile' 
for fn in os.listdir(path): 
    if os.path.isfile(fn): 
     # Import the excel file and call it xlsx_file 
     xlsx_file = pd.ExcelFile(fn) 
     # View the excel files sheet names 
     xlsx_file.sheet_names 
     # Load the xlsx files Data sheet as a dataframe 
     df = xlsx_file.parse('Sheet1',header= None) 
     df_NoHeader = df[2:] 
     data = df_NoHeader 
     appended_data.append(data) 
appended_data = pd.concat(appended_data) 

這是我目前得到的錯誤。

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-46-962ccf280c0b> in <module>() 
    11   data = df_NoHeader 
    12   appended_data.append(data) 
---> 13 appended_data = pd.concat(appended_data) 

C:\Anaconda2\lib\site-packages\pandas\tools\merge.pyc in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, copy) 
    832      keys=keys, levels=levels, names=names, 
    833      verify_integrity=verify_integrity, 
--> 834      copy=copy) 
    835  return op.get_result() 
    836 

C:\Anaconda2\lib\site-packages\pandas\tools\merge.pyc in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy) 
    865 
    866   if len(objs) == 0: 
--> 867    raise ValueError('No objects to concatenate') 
    868 
    869   if keys is None: 

ValueError: No objects to concatenate 
+0

完整回溯添加到您的問題 –

回答

3

最有可能的原因腳本之前的工作,而不是現在是你的Excel文件的文件夾移動它的位置,因爲這代碼使用相對路徑。嘗試使用將文件夾路徑名連接到文件名的絕對路徑。考慮使用os.path.join()甚至有助於保存到新文件夾:

dfList = [] 
path = 'C:\\Test\\TestRawFile' 
newpath = 'C:\\Path\\To\\New\\Folder' 

for fn in os.listdir(path): 
    # Absolute file path 
    file = os.path.join(path, fn) 
    if os.path.isfile(file): 
    # Import the excel file and call it xlsx_file 
    xlsx_file = pd.ExcelFile(file) 
    # View the excel files sheet names 
    xlsx_file.sheet_names 
    # Load the xlsx files Data sheet as a dataframe 
    df = xlsx_file.parse('Sheet1',header= None) 
    df_NoHeader = df[2:] 
    data = df_NoHeader 
    # Save individual dataframe 
    data.to_excel(os.path.join(newpath, fn)) 

    dfList.append(data) 

appended_data = pd.concat(dfList) 
appended_data.to_excel(os.path.join(newpath, 'master_data.xlsx')) 
+0

嗨,謝謝!我相信你是對的。我看不出有什麼其他的原因,爲什麼我的代碼有一天會工作,然後不工作。我收到一個錯誤,雖然這個代碼,它說以下內容:AttributeError:'DataFrame'對象沒有屬性'sheet_names' – brandog

+0

好吧,我發現了這個問題。 xlsx_file = pd.read_excel(文件)正在創建一個數據幀,我需要進入並選擇特定工作表,我將其更改爲xlsx_file = pd.ExcelFile(file)。現在我的問題是新創建的文件覆蓋原始文件。我想將所有編輯保存在一個新文件夾中。 (我想我可以弄明白)。謝謝!!! – brandog

+0

我創建了一個新路徑,AllFormatedFiles然後更改了data.to_excel(os.path.join(AllFormatedFiles,os.path.basename(file)))再次感謝您的幫助。 – brandog

1

IIUC你能做到這樣:

import os 
import glob 
import pandas as pd 

fmask = '/path/to/excel_files_dir/*.xls*' 
target_dir = '/path/to/' 
target_fname = '/path/to/result.xlsx' 

dfs = [] 
for f in glob.glob(fmask): 
    df = pd.read_excel(f, header=None, skiprows=2) 
    df.to_excel(os.path.join(target_dir, os.path.basename(f)), 
       index=False) 
    dfs.append(df) 

# save concatenated 
pd.concat(dfs, ignore_index=True).to_excel(target_fname, index=False) 
+0

謝謝,我結束了使用下面的答案。我的實際代碼不僅僅是刪除了兩個第一行,但是我把它排除了。儘管我使用了代碼的os.path.basename方面。那謝謝啦! – brandog

相關問題