如何在Azure Databricks中使用Python连接Azure FTP文件夹、读取文件名并合并文本文件?
在Azure Databricks中通过Python连接共享文件夹并合并文本文件
针对你提到的连接\\VMAZR1\ABCDFiles共享文件夹、筛选文本文件并合并的需求,我整理了两种在Azure Databricks中可行的方案,帮你搞定连接和文件处理的问题:
方法1:将SMB共享挂载到DBFS(推荐)
把共享文件夹挂载到Databricks文件系统(DBFS)后,操作文件会像本地文件一样方便,适合长期使用。
1. 挂载共享文件夹
首先在Databricks笔记本中运行以下代码完成挂载,需要提供共享的认证信息(如果是匿名访问可以省略extra_configs):
# 挂载SMB共享到DBFS指定路径 dbutils.fs.mount( source = "smb://VMAZR1/ABCDFiles", mount_point = "/mnt/abcd_files", extra_configs = { "smb.username": "你的共享访问用户名", "smb.password": "你的共享访问密码" } )
提示:如果是Azure Files存储账户的共享,
source格式为smb://<存储账户名>.file.core.windows.net/<共享名>,用户名是存储账户名,密码是存储账户的访问密钥。
2. 筛选文本文件
挂载完成后,就可以快速列出并筛选出所有.txt格式的文件:
# 列出挂载路径下的所有文件对象 all_files = dbutils.fs.ls("/mnt/abcd_files") # 筛选出后缀为.txt的文件,提取其完整路径 text_files = [file.path for file in all_files if file.name.lower().endswith(".txt")] print(f"共找到 {len(text_files)} 个文本文件")
3. 合并文件并保存
结合你已有的合并能力,这里给出两种合并方式的示例:
方式A:用Spark处理(适合大文件)
# 读取所有文本文件为DataFrame text_df = spark.read.text(text_files) # 合并为单个文件(coalesce(1)将数据合并到一个分区,大文件建议先调整分区再处理) text_df.coalesce(1).write.mode("overwrite").text("/mnt/abcd_files/merged_result.txt")
方式B:Python原生读取(适合小文件)
merged_content = "" # 遍历所有文本文件,读取内容并合并 for file_path in text_files: # DBFS路径需要转换为本地可访问的路径,前缀加/dbfs/ local_path = f"/dbfs{file_path}" with open(local_path, "r", encoding="utf-8") as f: merged_content += f.read() + "\n" # 每个文件后加换行分隔 # 保存合并后的内容到共享文件夹 with open("/dbfs/mnt/abcd_files/merged_result.txt", "w", encoding="utf-8") as f: f.write(merged_content)
方法2:直接用Python的smbclient库连接(临时操作)
如果只是临时操作不想挂载共享,可以用smbclient库直接连接SMB共享。
1. 安装依赖库
先在笔记本中运行命令安装smbclient:
%pip install smbclient
2. 连接共享并筛选文本文件
import smbclient # 配置共享连接参数 server_name = "VMAZR1" share_name = "ABCDFiles" username = "你的共享访问用户名" password = "你的共享访问密码" # 注册SMB会话,避免重复输入认证信息 smbclient.register_session(server_name, username=username, password=password) # 列出共享下的所有文件 all_files = smbclient.listdir(f"\\\\{server_name}\\{share_name}") # 筛选文本文件 text_files = [file for file in all_files if file.lower().endswith(".txt")] print(f"共找到 {len(text_files)} 个文本文件")
3. 合并并保存文件
merged_content = "" # 遍历读取每个文本文件内容 for file_name in text_files: file_path = f"\\\\{server_name}\\{share_name}\\{file_name}" with smbclient.open_file(file_path, "r", encoding="utf-8") as f: merged_content += f.read() + "\n" # 保存合并后的文件到原共享位置 output_path = f"\\\\{server_name}\\{share_name}\\merged_result.txt" with smbclient.open_file(output_path, "w", encoding="utf-8") as f: f.write(merged_content)
关键注意事项
- 确保你的Databricks集群和
VMAZR1服务器在同一个虚拟网络(VNet)中,或者防火墙已开放SMB协议的445端口,否则会无法连接。 - 处理大文件时优先使用Spark方式,避免Python原生读取导致内存溢出。
- 如果共享有特殊字符或权限限制,需要确认账户拥有足够的读写权限。
内容的提问来源于stack exchange,提问作者shazufaraz
相关产品推荐
相关产品推荐

