Python:尽管将完整的文件数据加载到框架中,但只将一行写入SQLite DB
我试图从“data.txt”中读取数据并将其写入SQLITE数据库,实际得到的只是记录的第一行。我通过打印pandas frame对象发现,它确实从“txt”中获取了所有数据,但未能在整个过程中进行迭代,对我来说,迭代循环看起来很好。有人能看出我在这里做错了什么,这使得它无法复制文件的所有行 文件数据如下所示:Python:尽管将完整的文件数据加载到框架中,但只将一行写入SQLite DB,python,pandas,sqlite,Python,Pandas,Sqlite,我试图从“data.txt”中读取数据并将其写入SQLITE数据库,实际得到的只是记录的第一行。我通过打印pandas frame对象发现,它确实从“txt”中获取了所有数据,但未能在整个过程中进行迭代,对我来说,迭代循环看起来很好。有人能看出我在这里做错了什么,这使得它无法复制文件的所有行 文件数据如下所示: 862 1 4828 1 6429 1 10013 1 7729 1 380 1 3808 1 7246 1 1663 1 其次,您会注意到列
862 1
4828 1
6429 1
10013 1
7729 1
380 1
3808 1
7246 1
1663 1
其次,您会注意到列之间的空格不一致,在某些地方有空格,在某些地方这些空格是用制表符分隔的。我有几千个不一致的行,这只是这些行的一个子集,仅供参考。有什么办法处理这个问题吗
我调整了delimiter参数和split函数,但它在这里不起作用。有什么建议吗
实际结果:
862 1
4828 1
6429 1
10013 1
7729 1
380 1
3808 1
7246 1
1663 1
数据库中只有一行
862 1
预期结果:
862 1
4828 1
6429 1
10013 1
7729 1
380 1
3808 1
7246 1
1663 1
下面是我试过的一段代码:
data = pd.read_csv ("data.txt")
rows = pd.DataFrame(data)
#print (rows)
for row in rows:
r = row.split()
object_id = r[0]
object_type = r[1]
cur.execute(''' INSERT INTO objects (object_id, object_type)
VALUES (?, ?) ''', (object_id, object_type))
conn.commit()
任何有价值的意见都将不胜感激!提前感谢。这应该可以按预期工作:
data=pd.read\u csv(“data.txt”,分隔符=“”,标题=None,名称=['object\u id','object\u type'],skipinitialspace=True)
对于data.itertuples(index=False)中的行:
当前执行(“”)插入对象(对象id、对象类型)
值(?,)“”,(行对象id,行对象类型))
康涅狄格州提交
header=None
确保文件中的第一行不被视为头行。名称
列出列名skipinitialspace=True
解决空白问题
在您的代码中,您是在遍历列名,而不是行。因为第一行(862,1)被解析为头,所以只有那一行被插入到数据库中
此外,您不必在每次迭代中都提交。在迭代结束时进行一次提交就足够了。这应该可以按预期工作:
data=pd.read\u csv(“data.txt”,分隔符=“”,标题=None,名称=['object\u id','object\u type'],skipinitialspace=True)
对于data.itertuples(index=False)中的行:
当前执行(“”)插入对象(对象id、对象类型)
值(?,)“”,(行对象id,行对象类型))
康涅狄格州提交
header=None
确保文件中的第一行不被视为头行。名称
列出列名skipinitialspace=True
解决空白问题
在您的代码中,您是在遍历列名,而不是行。因为第一行(862,1)被解析为头,所以只有那一行被插入到数据库中
此外,您不必在每次迭代中都提交。迭代结束时一次提交就足够了。不管这个答案如何,Shiva的更好 没什么不对的:
:
行=f.读行()
out=[]
对于行中的行:
对于.strip('\n').split('')行中的项目:
如果项目:
out.append(项目)
d={}
i=0
当i
然后迭代字典d上传到sql不管这个答案,Shiva的更好 没什么不对的:
:
行=f.读行()
out=[]
对于行中的行:
对于.strip('\n').split('')行中的项目:
如果项目:
out.append(项目)
d={}
i=0
当i
然后迭代字典d上传到sql,非常感谢您的输入。但我发现itertuples(index=False)除了index之外,所有值都归为一列(object_id)。然而,根据指定的列名称,它应该位于不同的列中。如果intertuples返回第一个值为0的元组,那么我们如何将元组的扩孔值复制到不同的列中?我使用您的示例“数据”进行了测试,我确实看到了不同的列。确保
pd.read\u csv
具有skipinitialspace=True
参数来清理空间。只有第一行分为单独的列,而不是所有行都分为第一列,并且是其选中的skipinitialspace=True。这是由ITERTURE返回的。它可以将第一行处理得很好,但也可以将两个值合并为一由选项卡分隔的列。熊猫(object_id='862',object_type=1.0)熊猫(object_id='4828\t1',object_type=nan)熊猫(object_id='6429\t1',object_type=nan)熊猫(object_id='10013\t1',object_type=nan)熊猫(object_id='380\t1',object_type=nan)熊猫(object_id='3808\t1',object_type=nan)熊猫(object_id='7246\t1',object_type=nan)在我的例子中,它只使用了一个分隔符参数delim_whitespace=True,不需要显式定义分隔符=''。然后skipinitialspace=True参数也将不再是必需的。非常感谢您的输入。但我发现了itertuples(index=False)除索引外,所有值都归为一列(object_id)。然而,根据指定的列名称,它应该位于不同的列中。如果intertuples返回第一个值为index=0的元组,那么我们如何将元组的扩孔值复制到不同的列中?我用您的示例“数据”进行了测试我确实看到了不同的列。请确保pd.read\u csv
具有skipinitialspace=True
argu
with open('test.txt','r') as f:
lines = f.readlines()
out = []
for line in lines:
for item in line.strip('\n').split(' '):
if item:
out.append(item)
d = {}
i = 0
while i < len(out)-1:
key = out[i]
value = out[i+1]
d[key] = value
i+=2