Python使用.iloc获取奇偶单行报错,调用R sidrar包批量生成CSV失败
问题修正方案
你遇到的报错核心原因是把全局行切片放在了循环内部,导致每次返回全量奇偶行而非当前循环对应的单条字符串,同时代码存在几处拼写和语法遗漏,修正方案如下:
核心修改点
- 替换循环内的全局切片写法,直接用循环变量
i定位当前行:iloc[i, 0]取奇序行字符串作为文件名,iloc[i+1, 0]取偶序行字符串作为URL前缀 - 修正拼写错误:将
table_Size改为table_size,补充导入rpy2的pandas转换器 - 补全代码末尾缺失的闭合括号
- 同步R侧文件读取逻辑,将pd.read_csv的分隔符改为
\n,避免读取数据错位 - 适配Python索引从0开始的规则,调整序列起始值为0,避免行错位和索引越界
修正后完整代码
import pandas as pd import numpy as np import rpy2.robjects.packages as rp from rpy2 import robjects as ro from rpy2.robjects.conversion import localconverter as lc # 补充导入pandas转换器 import rpy2.robjects.pandas2ri as pr utils = rp.importr('utils') utils.chooseCRANmirror(ind=1) utils.install_packages("sidrar") sidrar = rp.importr("sidrar") # 同步R侧读取逻辑,分隔符使用\n table_nameUrl = pd.read_csv("Data.txt", sep="\n", header= None) table_size = len(table_nameUrl) # 适配Python索引从0开始的规则,起始值设为0 sequence = np.arange(0, table_size, 2) for i in sequence: # 每次取单条字符串值 csv_name = table_nameUrl.iloc[i, 0] csv_url = table_nameUrl.iloc[i+1, 0] last_url = "/n3/all/n6/in%20n3%2028" file_name = f"{csv_name}.csv" url = f"{csv_url}{last_url}" with lc(ro.default_converter + pr.converter): file_nameC = ro.conversion.py2rpy(file_name) url_c = ro.conversion.py2rpy(url) ro.globalenv['fileName'] = file_nameC ro.globalenv['url'] = url_c ro.r('table= get_sidra(api= url)') # 补全缺失的闭合括号 ro.r('write.csv(table, file= fileName, row.names = F)')
内容的提问来源于stack exchange,提问作者Thiago Santana
相关产品推荐
相关产品推荐

