【问题标题】:Editing Paths in Python在 Python 中编辑路径
【发布时间】:2015-07-10 21:31:17
【问题描述】:

我正在尝试创建一个将自身复制到另一个位置并在桌面上创建批处理文件的程序。我可以让它自己复制,我可以创建批处理文件,但我需要一些有关路径的帮助。

我可以找到我的程序当前所在的路径。直接路径和目录路径。我的问题在于我想将文件放在(为了简单起见)'C:\Users\Me\Documents'。我将如何编辑路径?我希望能够将其放置在通用 Windows 计算机上,因此我无法硬编码路径,因为每个用户都会有所不同。放置批处理文件并将其设置为正确的目录以在文档中运行 python 脚本也是如此。

我都试过了

import os print os.path.dirname(os.path.abspath(__file__))

import os print os.path.abspath(__file__)

但我对如何编辑路径一无所知。当我尝试用谷歌搜索它并搜索这个精彩的网站时,我得到的只是关于在 Windows 上配置 Python 路径的内容以及我目前的 Python 水平还不太理解的其他内容。

现在我转向你,你能帮忙吗?如果您能解释它是如何工作的,那么任何输入都将不胜感激!

由于对我的代码(以及要发布的特定代码)的一些问题,这里是

from sys import argv            # Imports module
import os

script, create = argv           # Gets script name and desired amount of copies

data = open(script)             # Creates a variable to store the script

indata = copy.read()            # Creates the data to be copied from the script


batData = """
echo off
%s
""" %                           # This is not finished, creating that batch file

createT = int(create) + 1
for i in range(1, createT):     # Runs a set amount of times
    copyName = "%s.py" % str(i) # Creates the name for the file
    copy = open(copyName, 'w+') # Opens/creates the file for editing
    copy.write(indata)          # Writies the indata to the file opened
    copy.close                  # Closes that file

    batName = "%s.bat" % str(i)
    bat = open(batName, 'w+')

没有完成,但希望你能明白要点。开头的 argv 是为了让我可以更改制作的副本数量,稍后我会随着代码的发展将其删除,但现在我喜欢它。

我目前已尝试以下方法来查找路径:

import os
print os.path.abspath(__file__)
print os.path.dirname(os.path.abspath(__file__))
print os.path.dirname(__file__)

test = os.path.dirname(__file__)

a, b, c, d, e, f, g, h, i = test.split("\\")

print c

我想要发生的(或认为我想要发生的)是找到路径,然后分成几部分(每个目录或在用户名之后断开所有内容)。然后我想将文档文件夹标签附加到末尾。对于批处理而不是文档标签,它将用于桌面。

在人们发布的其他一些内容中。我希望这会有所帮助!

【问题讨论】:

  • 与批处理文件标签的关系在哪里?
  • 我正在使用:batName = "%s.bat" % str(i); bat = open(batName, 'w+') 创建文件。这有帮助吗?
  • “编辑路径”是什么意思?您想为用户提供一个输入字段以输入新路径,还是想从命令行中提取它,或者以某种方式计算它?您如何确定新路径是什么?
  • 我想要一种方法来编辑我可以从os.path.dirname(os.path.abspath(__file__)) 获取的内容我希望它是自动的,所以当程序运行时不需要任何输入。
  • @JakeT,由于您的术语,您可能没有通过搜索找到任何东西——“编辑路径”通常意味着更改系统 PATH(操作系统或 Python 的)。在您的具体情况下,请参阅我上面链接的问题;一般来说,您可以使用 os.path 方法——例如,您可以使用os.path.dirname() 来回退一个目录。路径只是一个字符串,因此您可以通过字符串连接 (... + '/build') 添加路径组件。然后你可以将它传递给open()os.chdir() 等,这取决于你想要做什么。

标签: python windows batch-file path


【解决方案1】:

您的代码 sn-p 返回一个字符串。只需使用该字符串并进行编辑以制作您想要的路径。我在 Mac 上,所以我无法使用实际的 Windows 目录进行测试,但我会尽量让它看起来像 Windows。例如,假设这段代码:

directory_path = os.path.dirname(os.path.abspath(__file__))
print(directory_path)

给你:

C:\Users\用户名\AppData

您可以使用split 函数将路径分成几部分 (docs)。

stuff = path_string.split('\')
print(stuff)

代码输出:

['C:', '用户', '用户名', 'AppData']

您可以使用这些片段创建您想要的路径,然后使用它来写入文件。因此,如果您想要用户名文件夹,只需循环直到找到它。下面是一些示例代码(只是一个帮助您入门的示例 - 如果您需要帮助理解代码,请阅读 Python)。

username = ""
for i in range(0, len(stuff)):
    if stuff[i] == "Users":
        username = stuff[i + 1]

不确定这是否能回答您的问题,但希望对您有所帮助。

【讨论】:

  • 谢谢!我也会尝试使用它,希望其中一个可以工作,哈哈。
  • 我尝试使用 split 函数,但是当我需要指定特定数量的值来解压时遇到了麻烦。我希望能够从任何地方运行它,所以我无法猜测值。这是我想将它们分成 a、b 和 c 的部分。 a 是磁盘,b 是用户,c 是程序的当前用户。如何在不遇到 ' 需要多个(随机数)个值才能解包的情况下做到这一点?
  • 我不太确定我是否理解您何时尝试这样做。请发布更多信息,例如您正在尝试的代码、可能的输入以及在给定特定输入的情况下您希望输出的样子。
  • 另外,您似乎是新来的。欢迎。请尽量提供尽可能详细的信息,并考虑对您在此处找到的有用的 cmets、问题和答案进行投票。
  • 感谢您的关注!我上传了代码.. 现在我想到了它都添加了一些我想要发生的伪代码,感谢您的输入。
【解决方案2】:

我是否正确,您试图弄清楚如何在不知道执行程序的用户是谁的情况下创建指向用户目录上某个位置的文件路径?

您也许可以为此利用环境变量。例如,我可以获取到正在执行代码的人的C://Users/username/ 目录的文件路径:

my_path = os.path.join("C:\\", "Users", os.getenv("USERNAME"))

其中os.getenv("USERNAME") 返回USERNAME 环境变量的值(应该是当前登录的用户名)。

您可以使用以下命令列出 Python 中所有可用的环境变量及其值:

for key, val in os.environ.items():
  print("{} \t {}\n".format(key, val))  # or however you want to prettify it

您可能会很幸运并找到一个环境变量,它可以为您提供大部分开始的路径。

一般来说,os.path.join()os.path.relpath()os.path.abspath() 结合一些环境变量可能会对您有所帮助。查看os documentationos.path documentation

【讨论】:

    【解决方案3】:

    多次修改路径时,我希望添加/删除文件夹。这是我添加路径的简单方法,例如如果我想将对象的路径移动到文件夹added_path='/train/.

    由于我的路径通常是统一的,因此我会检查第一个文件位置中的最后一个拆分字符。通常,我的经验是,Windows 末尾有\\,而 Mac 和 Linux 有 `/',这使得它可以跨操作系统工作。 (注意:如果路径不统一,你显然将 if-else 放在 for 循环中。)

    if '\\' in data[0].img_file:
        split_char = '\\'
    else:
        split_char = '/'
    
    for img in data:
        img_path = img.img_file.split(split_char)
        label_path = img.label_file.split(split_char)
        img.img_file = '/'.join(img_path[:-1]) + added_path  + img_path[-1]
        img.label_file = '/'.join(label_path[:-1]) + added_path  + label_path[-1]
    

    所以,这个 for 循环使用所有文件夹,直到文件名,我们在其中插入额外的文件夹,然后,最后,添加文件名。

    示例输入路径:'data/combined/18.png'

    示例输出路径:'data/combined/train/18.png'

    【讨论】:

      猜你喜欢
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-05-25
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      相关资源
      最近更新 更多