hynet1024 发表于 2023-8-22 16:31:01

关于save保存文件时指定路径

以下是我打开一个Excel文件读取其中内容保存为另一个Excel文件,我希望新文件与原文件保存在同一路径,但实际只能保存在当前Python代码运行路径下。
请大神指教:

        def on_convert_clicked(self):
                self.ui.message.clear()
                if salaryfile != None and len(salaryfile) > 0 :
                        wb = openpyxl.load_workbook(salaryfile, data_only=True)
                        ws = wb.active

                        for rows in range(ws.max_row, 2, -1):
                                ws.insert_rows(rows, 2)
                                for cols in range(1, ws.max_column + 1):
                                        ws.cell(rows + 1, cols).value = ws.cell(1, cols).value

                        wb.save(os.path.basename(salaryfile).split('.') + '_To工资条.xlsx')        # 工资条文件名格式:原文件名前缀_To工资条.xlsx
                        self.ui.message.append('已生成工资条文件:' + os.path.dirname(salaryfile).replace('/','\\') + '\\' + os.path.basename(salaryfile).split('.') + '_To工资条.xlsx')        # 实际保存路径为当前路径,非os.path.dirname(salaryfile).replace('/','\\')获取到的路径
                else:
                        self.ui.message.append("<font color=\"#FF0000\">请先选择工资数据文件</font>")

isdkz 发表于 2023-8-22 16:31:28

在保存文件时,您可以使用 os.path 模块来指定文件的保存路径。在您的代码中, wb.save() 方法中使用了 os.path.basename(salaryfile) 来获取原文件的文件名,然后使用 .split('.') 来去除文件名的扩展名,最后再加上 '_To工资条.xlsx' 作为新文件的文件名。

要指定路径,您可以使用 os.path.dirname(salaryfile) 来获取原文件的路径,并使用 os.path.join() 方法来连接路径和文件名。所以您可以修改代码如下:

import os

# ...

wb.save(os.path.join(os.path.dirname(salaryfile), os.path.basename(salaryfile).split('.') + '_To工资条.xlsx'))
self.ui.message.append('已生成工资条文件:' + os.path.join(os.path.dirname(salaryfile), os.path.basename(salaryfile).split('.') + '_To工资条.xlsx'))


这样,新文件将会保存在与原文件相同的路径下。

学习编程中的Ben 发表于 2023-8-22 16:31:34

关于保存文件时指定路径的解决方法

要将新文件保存在原文件的同一路径下,你需要使用原文件的路径作为基础,并根据需要添加新文件的名称。你可以使用os.path.dirname()和os.path.basename()函数来分别获取原文件的目录和文件名。

以下是修改后的代码示例:
import os
import openpyxl

def on_convert_clicked(self):
    self.ui.message.clear()
   
    if salaryfile is not None and len(salaryfile) > 0:
      wb = openpyxl.load_workbook(salaryfile, data_only=True)
      ws = wb.active

      for rows in range(ws.max_row, 2, -1):
            ws.insert_rows(rows, 2)
            for cols in range(1, ws.max_column + 1):
                ws.cell(rows + 1, cols).value = ws.cell(1, cols).value

      file_name = os.path.splitext(os.path.basename(salaryfile))
      new_file_path = os.path.join(os.path.dirname(salaryfile), file_name + '_To工资条.xlsx')
      
      wb.save(new_file_path)
      self.ui.message.append('已生成工资条文件:' + new_file_path.replace('/', '\\'))
    else:
      self.ui.message.append('<font color="#FF0000">请先选择工资数据文件</font>')


在上述代码中,我们使用os.path.splitext()函数获取原文件的文件名(不包括扩展名),然后使用os.path.join()函数将原路径和新文件名结合起来获得新文件的完整路径。最后,我们将新文件保存在这个路径下。

希望以上解答能够帮助你解决问题。如果还有其他疑问,请随时提问。

如果回答对你有帮助,请给我一个最佳答案!{:10_254:}{:10_254:}{:10_254:}

陶远航 发表于 2023-8-22 16:31:51

要指定保存路径为原文件所在的路径,可以使用os.path.dirname()函数获取原文件的目录路径,并将其与新文件名拼接起来作为保存路径。

在您的代码中,wb.save()方法保存文件时只使用了新文件名,因此默认保存在当前工作目录下。您可以修改如下:

import os

...

new_filename = os.path.dirname(salaryfile) + '\\' + os.path.basename(salaryfile).split('.') + '_To工资条.xlsx'
wb.save(new_filename)

self.ui.message.append('已生成工资条文件:' + new_filename)


使用os.path.dirname(salaryfile)获取原文件的目录路径,并与新文件名拼接起来作为新的保存路径。然后,将新路径传递给wb.save()方法进行保存操作。

注意,\是Windows下的路径分隔符,在其他操作系统中可能不适用。如果需要跨平台兼容,可以考虑使用os.path.join()函数来连接路径,它会根据操作系统自动选择适当的路径分隔符。例如:

new_filename = os.path.join(os.path.dirname(salaryfile), os.path.basename(salaryfile).split('.') + '_To工资条.xlsx')


这样可以确保在不同操作系统上都能正确处理路径。
如果问题已经解决,请设置最佳答案
页: [1]
查看完整版本: 关于save保存文件时指定路径