Python:尽管将完整的文件数据加载到框架中,但只将一行写入SQLite DB

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 其次,您会注意到列

我试图从“data.txt”中读取数据并将其写入SQLITE数据库,实际得到的只是记录的第一行。我通过打印pandas frame对象发现,它确实从“txt”中获取了所有数据,但未能在整个过程中进行迭代,对我来说,迭代循环看起来很好。有人能看出我在这里做错了什么,这使得它无法复制文件的所有行

文件数据如下所示:

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的更好

没什么不对的:

  • 如果要迭代DataFrame中的行,必须使用:
  • 如果文件有不一致的空格,那么我认为您不能在这里使用熊猫。我将执行以下操作以输出字典:
  • 以open('test.txt','r')作为f的
    :
    行=f.读行()
    out=[]
    对于行中的行:
    对于.strip('\n').split('')行中的项目:
    如果项目:
    out.append(项目)
    d={}
    i=0
    当i

    然后迭代字典d上传到sql

    不管这个答案,Shiva的更好

    没什么不对的:

  • 如果要迭代DataFrame中的行,必须使用:
  • 如果文件有不一致的空格,那么我认为您不能在这里使用熊猫。我将执行以下操作以输出字典:
  • 以open('test.txt','r')作为f的
    :
    行=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