我正在使用 pyspark 2.1
问题陈述:需要验证 hdfs path
,文件(如果存在)需要将文件名复制到变量中
下面是代码使用后,迄今为止参考了一些网站和网站 stackoverflow
```
import os
import subprocess
import pandas as pd
import times
def run_cmd(args_list):
print('Running system command: {0}'.format(' '.join(args_list)))
proc = subprocess.Popen(args_list, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
proc.communicate()
return proc.returncode
today = datetime.now().date().strftime('%d%b%Y')
source_dir = '/user/dev/input/'+ today
hdfs_file_path=source_dir+''student marks details.csv''
cmd = ['hdfs', 'dfs', '-find','{}','-name', hdfs_file_path]
code=run_cmd(cmd)
if code<>1:
print 'file doesnot exist'
System.exit(1)
else:
print 'file exist'
在上面的代码中,我得到的错误是“文件不存在”,但该文件存在于该文件夹中
问题是能否在shell控制台中运行runbelow命令我正在获取完整的路径。
hdfs dfs -find () -name /user/dev/input/08Aug2017/'student marks details.csv'
当我试图用上面的详细代码导入pyspark时,我无法执行,因为文件名中存在空格。请帮助我解决这个问题。
1条答案
按热度按时间5q4ezhmt1#
问题
你的问题在这条线上:
您正在添加两个不需要的单引号,而且还忘记添加目录分隔符。
此命令中路径工作的原因:
因为这是一个shell命令。在您正在使用的shell(可能是bash)上,以下命令是等效的:
bash删除引号,并将字符串合并在一起,产生相同的字符串结果,即
/user/dev/input/08Aug2017/student marks details.csv
. 引号实际上不是路径的一部分,只是告诉bash不要在空格处拆分字符串,而是创建一个字符串,然后删除引号。当你写:
你最终得到的道路是
/user/dev/input/08Aug2017'student marks details.csv'
,而不是正确的/user/dev/input/08Aug2017/student marks details.csv
.这个
subprocess
调用只需要对应于所需值的纯字符串,并且不会像shell那样处理它们。解决方案
在python中,连接路径最好通过调用
os.path.join
. 所以我建议更换这些线路:包括以下内容: