Перебирайте и разделяйте имена файлов Excel и сохраняйте их как данные в Pandas - PullRequest
0 голосов
/ 11 июня 2019

Скажем, у меня есть папка folder1 с файлами Excel, их имена имеют одинаковую структуру: city, building name and id, я хочу сохранить их в датафрейме, а затем в файле Excel. Обратите внимание, что в результате мне также нужно добавить имена файлов Excel других папок.

bj-LG center-101012.xlsx
sh-ABC tower-1010686.xlsx
bj-Jinzhou tower-101018.xlsx
gz-Zijin building-101012.xls
...

Первый метод, который я попробовал:

import os
import pandas as pd
from pandas import DataFrame, ExcelWriter

path = os.getcwd()
file = [".".join(f.split(".")[:-1]) for f in os.listdir() if os.path.isfile(f)] #exclude files' extension

city = file.split('-')[0]
projectName = file.split('-')[1]
projectID = file.split('-')[2]
    #print(city)        
df = pd.DataFrame(columns = ['city', 'building name', 'id'])
df['city'] = city
df['building name'] = projectName
df['id'] = projectID    

writer = pd.ExcelWriter("C:/Users/User/Desktop/test.xlsx", engine='xlsxwriter')
df.to_excel(writer, index = False)
writer.save()

Проблема:

Traceback (most recent call last):

  File "<ipython-input-203-c09878296e72>", line 9, in <module>
    city = file.split('-')[0]

AttributeError: 'list' object has no attribute 'split'

Мой второй метод:

for root, directories, files in os.walk(path):
    #print(root)
    for file in files:
        if file.endswith('.xlsx') or file.endswith('.xls'):
            #print(file)            
            city = file.split('-')[0]
            projectName = file.split('-')[1]
            projectID = file.split('-')[2]
            #print(city)        
    df = pd.DataFrame(columns = ['city', 'building name', 'id'])
    df['city'] = city
    df['building name'] = projectName
    df['id'] = projectID    

    writer = pd.ExcelWriter("C:/Users/User/Desktop/test.xlsx", engine='xlsxwriter')
    df.to_excel(writer, index = False)
    writer.save()

Я получил пустой файл test.xlsx, как я могу заставить его работать? Спасибо.

Ответы [ 3 ]

2 голосов
/ 11 июня 2019

Это разделяет расширение файла, затем распаковывает разделение в vairables. Создает словарь, затем добавляет словарь в фрейм данных.

files = [
    "bj-LG center-101012.xlsx",
    "sh-ABC tower-1010686.xlsx",
    "bj-Jinzhou tower-101018.xlsx",
    "gz-Zijin building-101012.xls"]

df = pd.DataFrame()
for file in files:
    filename = file.split(".")[0]
    city, projectName, projectID = filename.split("-")
    d = {'city':city,'projectID':projectID,'projectName':projectName}


    df = df.append(d,ignore_index=True)

df.to_excel('summary.xlsx')
2 голосов
/ 11 июня 2019

Метод 2 близок.

Вам необходимо создать кадр данных перед циклом for.После назначения переменных создайте словарь переменных и добавьте его в кадр данных.Возможно, есть и лучший способ найти список файлов с помощью glob, но я просто поработаю с тем, что вы уже сделали.

df = pd.DataFrame()
for root, directories, files in os.walk(path):

    for file in files:
        if file.endswith('.xlsx') or file.endswith('.xls'):
            #print(file)            
            city = file.split('-')[0]
            projectName = file.split('-')[1]
            projectID = file.split('-')[2]
            #append data inside inner loop
            d = {'city':city, 'building name':projectname, 'id':projectID}
            df.append(d)


writer = pd.ExcelWriter("C:/Users/User/Desktop/test.xlsx", engine='xlsxwriter')
df.to_excel(writer, index = False)
writer.save()
1 голос
/ 11 июня 2019

Это должно работать, благодаря подсказке glob от @Dan Wisner

import os
from glob import glob

fileNames = [os.path.splitext(val)[0] for val in glob('*.xlsx') or glob('*.xls')]

df = pd.DataFrame({'fileNames': fileNames})
df[['city', 'name', 'id']] = df['fileNames'].str.split('-', n=2, expand=True)

del df['fileNames']

writer = pd.ExcelWriter("C:/Users/User/Desktop/test1.xlsx", engine='xlsxwriter')
df.to_excel(writer, index = False)
writer.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...