目录中的 Python/VBA 输出文件
Posted
技术标签:
【中文标题】目录中的 Python/VBA 输出文件【英文标题】:Python/VBA outputting file in directory 【发布时间】:2013-10-09 21:08:08 【问题描述】:我正在使用以下命令从 Microsoft Access VBA 成功运行我的 Python 脚本:,
Shell (CurrentProject.Path & "\Python\Python-Portable.exe " & CurrentProject.Path & "\Python\scripts\convert.py")
当 Python 脚本运行时,csv 输出被放置在我的 Windows 主目录中。以下是 convert.py 的 Python 源代码:
#!/usr/bin/python
import sys, os
from openpyxl.reader.excel import load_workbook
def main():
wb=load_workbook(filename='list.xlsx')
for sheet in wb.worksheets:
csv_file='%s.csv' % sheet.title
print 'Creating %s' % csv_file
fd=open(csv_file, 'wt')
for row in sheet.rows:
values=[]
for cell in row:
value=cell.value
if value is None:
value=''
if not isinstance(value, unicode):
value=unicode(value)
value=value.encode('utf8')
values.append(value)
fd.write('\t'.join(values))
fd.write('\n')
fd.close()
if __name__=='__main__':
main()
我希望将 CSV 文件放入“CurrentProject.Path & “\Python\scripts\”。关于为什么 Access VBA 将我的输出放入我的 Windows 主目录的任何建议?
谢谢
【问题讨论】:
【参考方案1】:Shell
函数不保证它运行的程序有任何特定的工作目录——事实上,我相信它使用默认 shell 的任何默认值,这往往意味着你在较新的 Windows 上的主目录和在旧版 Windows 上完全没用的地方。
当您指定像 'mysheet.csv'
这样的裸文件名(或像 r'foo\mysheet.csv'
这样的相对路径名)时,Python 将使用当前工作目录来决定将其放在哪里。
因此,您的 VBA 脚本必须在运行程序之前明确地 cd
,或者更简单地说,您的 Python 脚本必须明确地将文件放在正确的位置。
例如,如果您希望文件在脚本文件本身旁边结束(这是一件很奇怪的事情,但这似乎是您所要求的):
import sys, os
scriptdir = os.path.dirname(os.path.abspath(__file__))
# ... later ...
fd=open(os.path.join(scriptdir, csv_file), 'wt')
或者,您可能希望使 VB 脚本可以将输出目录作为参数传递:
fd = open(os.path.join(sys.argv[1], csv_file), 'wt')
然后:
Shell (CurrentProject.Path & "\Python\Python-Portable.exe " &
CurrentProject.Path & "\Python\scripts\convert.py " &
CurrentProject.Path & "\Python\scripts")
【讨论】:
以上是关于目录中的 Python/VBA 输出文件的主要内容,如果未能解决你的问题,请参考以下文章