【问题标题】:Jython not finding file when using variable to pass file name使用变量传递文件名时,Jython 找不到文件
【发布时间】:2014-06-08 16:54:51
【问题描述】:

那么问题来了,伙计们,

我有一个非常简单的小程序,它从文件中读取一些设置细节(使其可重复用于其他数据集)并将它们存储到变量中。

然后它使用其中一个变量打开另一个文件,我需要在其中写入一些结果以及各种搜索参数。

当将变量传递给 .open() 函数时,它会说找不到文件,但是当传递完全相同的信息,但作为写入字符串而不是变量时,它可以工作。

这是一个已知问题,还是我只是做错了什么?

代码(问题加粗)

def urlTrawl(filename):
  import urllib
  read = open(getMediaPath(filename), "rt")
  baseurl = read.readline()
  orgurl = read.readline()
  lasturlfile = read.readline()
  linksfile = read.readline()
  read.close()
  webpage = ""
  links = ""
  counter = 0
  lasturl = ""
  nexturl = ""
  url = ""
  connection = ""
  try:
    read = open(lasturlfile, "rt")
    lasturl = read.readline()
  except IOError:
    print "IOError"

  webpage = connection.read()
  connection.close()
  **file = open(linksfile, "wt")**

  file.close()
  file = open(lasturlfile, "wt")
  file.write(nexturl)
  return 1

传入的信息

http://www.questionablecontent.net/
http://www.questionablecontent.net/view.php?comic=2480
C:\\Users\\James\\Desktop\\comics\\qclast.txt
C:\\Users\\James\\Desktop\\comics\\comiclinksqc.txt
strip\"
src=\"
\"
Pevious
Next
f=\"
\"

编辑:删除工作代码以缩小问题范围并更新代码以使用直接引用而不是相对引用。

【问题讨论】:

  • 看起来您的路径名称相对于当前目录。当您传入字符串时,您是否使用相同的相对路径?两种情况下的当前目录是否相同?您可能要考虑尝试将此代码缩减为SSCCE。看起来您有一些上面未包含的已定义函数,这是一段相当庞大的代码。还有一件事:getMediaPath(filename)。你确定getMediaPath 工作正常吗?
  • 是的,因为我之前使用 setMediaPath 为我的 ide 设置了路径。我觉得很奇怪的原因是,如果我说 file = open(getMediaPath("comiclinksqc.txt"), "wt") 它可以工作,但是使用保存该值的变量却不行。我也将其更改为使用完整路径引用而不是 getMediaPath(),但仍然无法正常工作。

标签: jython


【解决方案1】:

我最终发现了问题。

问题是它在我的详细信息文件中每一行末尾的 \n 中读取,当然 \n 不在我正在阅读的网站数据中的任何位置。删除每个读取的最后一个字符就可以了:

baseurl = baseurl[:-1]
orgurl = orgurl[:-1]
lasturlfile = lasturlfile[:-1]
linksfile = linksfile[:-1]
search1 = search1[:-1]
search2 = search2[:-1]
search3 = search3[:-1]
search4 = search4[:-1]
search5 = search5[:-1]
search6 = search6[:-1]

【讨论】:

  • 一个更强大的解决方案可能是使用strip。这也将考虑行首或行尾的空格或制表符,使您的文件格式更加灵活。如果您担心文件名在末尾包含空格或文件夹名称以空格开头的相对路径,则将strip 限制为换行符:baseurl.strip('\n\r')
【解决方案2】:

我可能不对,但我认为这就是正在发生的事情。

你说这很好用:

file = open('C:\\Users\\James\\Desktop\\comics\\comiclinksqc.txt', "wt")

但这不是:

# After reading three lines
linksfile = read.readline()
file = open(linksfile, "wt")

这两者是有区别的。在第一段代码中,双斜杠是转义。当 Python 完成解析时,它们解析为单斜杠。像这样:

>>> print 'C:\\Users\\James\\Desktop\\comics\\comiclinksqc.txt'
C:\Users\James\Desktop\comics\comiclinksqc.txt

但是,当您从文件中读取相同的文本时,不会对文本进行解析。这意味着存储在变量中的字符串仍然有双斜杠

试试这个命令。我敢打赌,它的失败方式与您在以下位置读取文件路径时相同:

file = open(r'C:\\Users\\James\\Desktop\\comics\\comiclinksqc.txt', "wt")

r 代表“原始”;它可以防止 Python 解释转义字符。如果它确实以同样的方式失败,那么双斜杠就是你的问题。要修复它,在您的文件中,您需要删除双斜杠:

C:\Users\James\Desktop\comics\comiclinksqc.txt

这在 CPython 2.7 中不是问题;我打赌它也不在 3.x 中。 CPython 以某种方式解释双斜杠,它们实际上是单斜杠(至少在大多数情况下)。所以这可能是 Jython 特有的问题。

如果不干净的路径导致错误,您可能需要考虑做一些事情来清理它们。 os.path.abspath 可能会有所帮助,尽管我不能说 Jython 的实现是否与 CPython 的一样好:

>>> print os.path.abspath(r'C:\\Users\\James\\Desktop\\comics\\comiclinksqc.txt')
C:\Users\James\Desktop\comics\comiclinksqc.txt
>>> print os.path.abspath(r'C:/Users/James/Desktop/comics/comiclinksqc.txt')
C:\Users\James\Desktop\comics\comiclinksqc.txt

【讨论】:

  • 感谢您的详细回复,但是 file = open(r'C:\\Users\\James\\Desktop\\comics\\comiclinksqc.txt', "wt") 确实有效在开始工作后,我将其关闭,并检查了我的链接文件,之后似乎有错误的数据,这意味着程序也没有正确读取我的搜索参数。
【解决方案3】:

我正在尝试创建一个脚本,该脚本将列出数据源名称并显示连接池利用率(池连接,空闲池大小分机) 但是在列出连接池时遇到问题,如果数据源名称之间有空格,例如“默认数据源” 然后它列出列表“默认数据源,它没有将数据源名称正确解析到下一个函数。

datasource = AdminConfig.list('DataSource', AdminConfig.getid( '/Cell:' 
+ cell + '/')).splitlines()                                             
for datasourceID in datasource:                                         
        datasourceName = datasourceID.split('(')[0]                     
        print datasourceName 

如果可能的话,请您帮忙给我发邮件至 bubuldey@gmail.com 问候, 布布尔

【讨论】:

  • 欢迎来到 Stack Overflow!与讨论论坛不同,如果您遇到类似问题,则不应发布到现有问题。右上角的 链接可用于提出新问题。当提出新问题时,您可以链接到其他帖子并解释为什么他们没有解决您的问题。提问时不要包括您的电子邮件地址。这不是请求私人导师的正确地点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2020-01-28
  • 1970-01-01
  • 1970-01-01
  • 2014-02-03
  • 1970-01-01
相关资源
最近更新 更多