python - os.walk 在 Python 中
问题描述
我正在尝试浏览音频文件的目录,以便将它们的数据打印到 Excel 工作表中。现在我只能访问根文件夹中的文件 - 我一直在访问任何子文件夹中的文件。当我在'if os.path.isfile(audio_file):'行之前'print(audio_file)'时,它会遍历所有目录中的所有文件,但是我有'isfile'行,所以下面的代码只查看文件. 我被困在这一点上,不知道该怎么做。
os.walk 循环位于代码的底部:
import openpyxl, os, wave, time, datetime
from openpyxl.styles import Font
from datetime import datetime
os.chdir('c:\\Users\\Sonorityscape\\Desktop\\audiofiles')
wb = openpyxl.Workbook()
sheet = wb['Sheet']
headings = {'A1' : 'File Name',
'B1' : 'Relative Path',
'C1' : 'File Size',
'D1' : 'Date of Creation',
'E1' : 'File Length (hr:mn:sc.msc)',
'F1' : 'Channels',
'G1' : 'Sample Rate',
'H1' : 'Bit Depth'}
cell_widths = {'A' : 30,
'B' : 40,
'C' : 11.5,
'D' : 19,
'E' : 25.75,
'F' : 10.5,
'G' : 13.5,
'H' : 10.5}
for k, v in headings.items():
sheet[k].value = v
sheet[k].font = Font(bold = True, name = 'Calibri', size = 12)
for k, v in cell_widths.items():
sheet.column_dimensions[k].width = float(v)
def file_info(file_name, folder_name, file_size, date_time, col_file, col_folder, col_size, col_time):
sheet.cell(row = r, column = col_file).value = file_name
sheet.cell(row = r, column = col_folder).value = folder_name
sheet.cell(row = r, column = col_size).value = str(round((file_size / 2**20), 3)) + ' MB'
sheet.cell(row = r, column = col_time).value = date_time
def sample_rate(frames, col):
frame_rate = w.getframerate()
file_length = (frames / frame_rate)
length_milliseconds = str(round((frames / frame_rate), 3))
sheet.cell(row = r, column = col).value = str(time.strftime('%H:%M:%S', time.gmtime(file_length))) + '.' + length_milliseconds[-3:]
def wave_info(channels, frame_rate, bit_depth, col_chan, col_fr, col_bit):
sheet.cell(row = r, column = col_chan).value = channels
sheet.cell(row = r, column = col_fr).value = str(frame_rate) + ' Hz'
sheet.cell(row = r, column = col_bit).value = str(bit_depth * 8) + ' bit'
r = 3
for root, dirs, files in os.walk('c:\\Users\\Sonorityscape\\Desktop\\audiofiles'):
for audio_file in files:
if os.path.isfile(audio_file):
w = wave.open(audio_file)
file_name = os.path.basename(audio_file)
folder_name = os.path.relpath('c:\\audiofiles\\' + audio_file, 'c:\\desktop')
file_size = os.path.getsize(audio_file)
time_created = os.path.getctime(audio_file)
date_time = datetime.fromtimestamp(time_created).strftime('%b. %d, %Y, %H:%M:%S')
frames = w.getnframes()
if w.getnchannels() == 2:
channels = 'Stereo'
else:
channels = 'Mono'
frame_rate = w.getframerate()
bit_depth = w.getsampwidth()
file_info(file_name, folder_name, file_size, date_time, 1, 2, 3, 4)
sample_rate(frames, 5)
wave_info(channels, frame_rate, bit_depth, 6, 7, 8)
w.close()
r += 1
wb.save('c:\\users\\sonorityscape\\desktop\\audiofilesexcel.xlsx')
解决方案
您需要修改此行:
if os.path.isfile(audio_file):
至
if os.path.isfile(os.path.join(root,audio_file)):
由于 audio_file 只是一个文件名字符串,您应该将 abs 路径添加到文件中。您使用代码更改了当前路径:
os.chdir('c:\\Users\\Sonorityscape\\Desktop\\audiofiles')
这就是为什么您可以获取根目录中的文件而不是子文件夹的原因。
推荐阅读
- math - 在 Jupyter Notebook 中用 Markdown 编写的数学符号在 GitHub 上呈现不一致
- node.js - 在控制台中将 NodeJS / MongoDB 查询输出到 String Runnable
- gradle - 如何强制更改gradle中mudule的依赖关系
- react-native-android - react native run android不起作用,并且无法安装应用程序
- angular - PrimeNG p-tree 过滤器问题
- java - 不允许在数组列表中重复对象
- android - 如何在onDatachanged中存储arraylist并在android外部返回
- javascript - 映射 JS 数组并将变量传递到 JSON 输出
- git - 删除提交,但不是 git 中的最后一个
- python-3.x - 终端命令:循环数