2016-06-26 13 views
3

forループで問題が発生しました。 何が起こったのか分かりませんが、これはうまくいきましたが、今は「連結するオブジェクトがありません」と伝えます。ループはExcelファイルで何かをして新しいフォルダに保存しますpython pandas

私は2つのことを達成したいと思います。 フォルダ内のすべての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

Okこの問題を発見しました。 xlsx_file = pd.read_excel(ファイル)がデータフレームを作成していたので、特定のシートを選択してxlsx_file = pd.ExcelFile(ファイル)に変更する必要がありました。今では私の問題は、新しく作成されたファイルがオリジナルファイルを上書きしてしまうことです。すべての編集内容を新しいフォルダに保存したいと思います。 (私はそれを理解することができると思う)。ありがとう!!! – 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

おかげで完全なトレースバックを追加し、私は以下の回答を使用して終了しました。私の実際のコードは、2つの最初の行を削除するだけではありません。私はあなたのコードのos.path.basenameの側面を使用しました。ほんとありがと! – brandog

関連する問題