gpt4 book ai didi

python - 文件名有空格的 Pyspark 错误处理

转载 作者:可可西里 更新时间:2023-11-01 16:38:53 29 4
gpt4 key购买 nike

我正在使用 pyspark 2.1

问题陈述:需要验证hdfs路径,文件如果存在需要将文件名复制到变量中

以下是在引用了几个网站和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 控制台中运行下面的命令,我正在获取完整路径。

hdfs dfs -find () -name /user/dev/input/08Aug2017/'student marks details.csv'

当我尝试使用上述详细代码导入 pyspark 时,我无法执行,因为文件名中存在空间。请帮我解决这个问题。

最佳答案

问题

你的问题在这一行:

 hdfs_file_path = source_dir + '\'student marks details.csv\''

您添加了两个不需要的单引号,并且还忘记添加目录分隔符。

路径在此命令中起作用的原因:

hdfs dfs -find () -name /user/dev/input/08Aug2017/'student marks details.csv'

是因为这是一个shell命令。在您正在使用的 shell 上(大概是 bash ),以下命令是等效的:

echo '/user/dev/input/08Aug2017/student marks details.csv'
echo /user/dev/input/08Aug2017/'student marks details.csv'

bash 删除引号,并将字符串合并在一起,产生相同的字符串结果,即 /user/dev/input/08Aug2017/student marks details.csv。引号实际上不是路径的一部分,只是告诉 bash 不要在空格处拆分字符串,而是创建一个字符串,然后删除引号的一种方式。

当你写的时候:

 hdfs_file_path = source_dir + '\'student marks details.csv\''

你最终得到的路径是/user/dev/input/08Aug2017'student marks details.csv',而不是正确的/user/dev/input/08Aug2017/student标记 details.csv.

subprocess 调用只需要与您想要的值相对应的纯字符串,并且不会像 shell 那样处理它们。

解决方案

在 python 中,将路径连接在一起最好通过调用 os.path.join 来执行。 .所以我建议替换这些行:

source_dir = '/user/dev/input/' + today
hdfs_file_path = source_dir + '\'student marks details.csv\''

具有以下内容:

source_dir = os.path.join('/user/dev/input/', today)
hdfs_file_path = os.path.join(source_dir, 'student marks details.csv')

os.path.join 会在其参数之间添加一个目录分隔符(/在 Unix 上,\在 Windows 上),因此您不会不小心忘记分隔符或添加它两次。

关于python - 文件名有空格的 Pyspark 错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45780742/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com