Python代码报错求助:先遇UnboundLocalError,加global后出SyntaxError
解决Python代码中的UnboundLocalError和SyntaxError问题
让我们一步步拆解你的问题,然后给出实用的修复方案:
第一个错误:UnboundLocalError的核心原因
你遇到的UnboundLocalError: local variable 'data' referenced before assignment,本质是变量未被定义就被引用。
看你的代码逻辑:如果requests.get(source)抛出异常(比如网络超时、URL无效),第一个try块里的data变量根本不会被赋值。但程序会直接进入第二个try块,这时你在writerow里调用data,自然就会报错——因为这个变量压根没被创建出来。
另外,你用了两层宽泛的except:,直接吞掉所有异常,这会让你完全不知道问题出在哪(是请求失败?还是文件写入失败?),非常不利于调试。
第二个错误:global语句的误用
你添加global data后出现SyntaxError,是因为global的用法完全不对。global是用来告诉Python:“我要使用全局作用域里的这个变量”,但你这里既没有全局的data变量,也完全不需要用全局变量——你只需要确保data在被使用前一定已经被正确赋值就行。
修复后的代码示例
下面是修正后的代码,我加了详细的注释和针对性改进:
import requests import csv def get_data(): # 替换成你实际要请求的URL source = "https://example.com/your-data-endpoint" try: # 发起请求,用response命名更清晰,避免和最终数据混淆 response = requests.get(source) # 主动触发HTTP错误(比如404、500),这样请求失败时会直接进入except块 response.raise_for_status() # 提取实际数据:这里假设你要的是文本内容,根据需求换成response.json()或其他格式 actual_data = response.text # 只有请求成功拿到数据后,才执行写入操作 try: # newline=''避免CSV写入时出现空行(Windows系统常见问题) with open('data_file.csv', 'a', newline='') as file: fieldnames = ['Column'] writer = csv.DictWriter(file, fieldnames=fieldnames) # 检查文件是否为空,为空则写入表头(避免重复表头或无表头) file.seek(0, 2) if file.tell() == 0: writer.writeheader() # 写入实际数据 writer.writerow({'Column': actual_data}) except (OSError, csv.Error) as e: # 捕获文件操作相关的具体异常,并打印错误信息 print(f"写入CSV文件失败: {str(e)}") except requests.exceptions.RequestException as e: # 捕获所有请求相关的异常(网络问题、HTTP错误等) print(f"请求数据源失败: {str(e)}")
关键改进点说明
- 避免未定义变量:只有在
requests.get成功拿到响应后,才执行写入逻辑,确保actual_data一定有值。 - 捕获具体异常:不再用
except:吞掉所有异常,而是分别捕获请求相关和文件操作相关的具体异常,方便快速定位问题。 - 正确处理Response对象:
requests.get返回的是Response对象,不是直接的内容,所以需要用response.text/response.json()提取你需要的数据。 - CSV表头处理:自动判断文件是否为空,第一次写入时添加表头,避免后续重复写入或缺失表头。
- 移除不必要的global:完全不需要全局变量,函数内部的变量在正确的分支中定义和使用即可。
内容的提问来源于stack exchange,提问作者Karma
相关产品推荐
相关产品推荐

