我正在尝试将一堆页面保存在创建它们的py文件旁边的文件夹中。我在Windows上,所以当我尝试为文件路径制作尾部反斜杠时,它会改为使用特殊字符。
这就是我所说的:
from bs4 import BeautifulSoup
import urllib2, urllib
import csv
import requests
from os.path import expanduser
print "yes"
with open('intjpages.csv', 'rb') as csvfile:
pagereader = csv.reader(open("intjpages.csv","rb"))
i=0
for row in pagereader:
print row
agentheader = {'User-Agent': 'Nerd'}
request = urllib2.Request(row[0],headers=agentheader)
url = urllib2.urlopen(request)
soup = BeautifulSoup(url)
for div in soup.findAll('div', {"class" : "side"}):
div.extract()
body = soup.find_all("div", { "class" : "md" })
name = "page" + str(i) + ".html"
path_to_file = "\cleanishdata\"
outfile = open(path_to_file + name, 'w')
#outfile = open(name,'w') #this works fine
body=str(body)
outfile.write(body)
outfile.close()
i+=1
我可以将文件保存到.py文件所在的文件夹中,但是当我使用rapidminer处理文件时,它也包含该程序。如果我可以将它保存在目录中,它也会更整洁。
我很惊讶这在整个互联网上都没有得到解答。
编辑:非常感谢!我最终使用了你的两个答案中的信息。 IDLE让我使用r'\ string \'将字符串与反斜杠连接起来。我需要使用abamert的path_to_script技术来解决在py文件所在的位置创建新文件夹的问题。再次感谢!以下是相关的编码更改: name = "page" + str(i) + ".txt"
path_to_script_dir = os.path.dirname(os.path.abspath("links.py"))
newpath = path_to_script_dir + r'\\' + 'cleanishdata'
if not os.path.exists(newpath): os.makedirs(newpath)
outfile = open(path_to_script_dir + r'\\cleanishdata\\' + name, 'w')
body=str(body)
outfile.write(body)
outfile.close()
i+=1
答案 0 :(得分:2)
你确定你能确保正确地逃避反斜杠吗?
字符串\"
中的"\cleanishdata\"
实际上是转义引号字符("
)。
你可能想要
r"\cleanishdata\"
或
"\\cleanishdata\\"
您可能还想查看os.path
库,特别是os.path.join
和os.path.dirname
。
例如,如果您的文件位于C:\Base\myfile.py
,并且您希望将文件保存到C:\Base\cleanishdata\output.txt
,则您需要:
os.path.join(
os.path.dirname(os.path.abspath(sys.argv[0])), # C:\Base\
'cleanishdata',
'output.txt')
答案 1 :(得分:0)
比硬编码.py
文件的路径更好的解决方案就是向Python询问它:
import sys
import os
path_to_script = sys.argv[0]
path_to_script_dir = os.path.dirname(os.path.abspath(path_to_script))
此外,通常最好使用os.path
方法而不是字符串操作:
outfile = open(os.path.join(path_to_script_dir, name), 'w')
除了让您的程序继续按预期工作,即使您将其移动到其他位置或将其安装在另一台计算机上或将其提供给朋友,除去硬编码路径和基于字符串的路径连接意味着您不要不用担心任何地方的反斜杠,这个问题从一开始就不会出现。