You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:51:14