当前位置: 首页 > 知识库问答 >
问题:

在python中读取制表符分隔值txt文件时遇到问题

籍靖
2023-03-14

我试图读取一个标签分隔值txt文件在python中,我从AWS存储中提取。(

import io
import pandas as pd
import boto3
import csv
from bioservices import UniProt
from sqlalchemy import create_engine
s3 = boto3.resource(
    service_name='s3',
    region_name='us-east-2',
    aws_access_key_id='XXX',
    aws_secret_access_key='XXX'
)

所以这只是为了连接到AWS。接下来,当我运行这段代码来读取存储在AWS中的以制表符分隔的txt文件时

txt = s3.Bucket('compound-bioactivity-original-files').Object('helper-files/kinhub_human_kinase_list_30092021.txt').get()
txt_reader = csv.reader(txt, delimiter='\t')
for line in txt_reader:
    print(line)

我得到了这个输出,这不是我想要的。使用方言='excel-tab'而不是分隔符='\t'也给了我相同的输出

['ResponseMetadata']
['AcceptRanges']
['LastModified']
['ContentLength']
['ETag']
['VersionId']
['ContentType']
['Metadata']
['Body']

共有1个答案

颛孙智勇
2023-03-14

你的代码有几个问题。

首先,对象。get()不返回Amazon S3对象的内容。相反,根据对象。get()文档,它返回:

{
    'Body': StreamingBody(),
    'AcceptRanges': 'string',
    'LastModified': datetime(2015, 1, 1),
    'ContentLength': 123,
    'ETag': 'string',
    'VersionId': 'string',
    'CacheControl': 'string',
    'ContentDisposition': 'string',
    ...
    'BucketKeyEnabled': True|False,
    'TagCount': 123,
}

通过插入print(txt)作为调试行,可以看到这种情况。

如果您想访问对象的内容,您将使用body元素。要检索流式传输主体的内容,您可以使用. read()

但是,由于对象被视为二进制文件,因此返回为二进制字符串。在Python中,您可以使用. decode('ascii')将其转换回ASCII。请参阅:如何在Python3中将二进制字符串转换为普通字符串?

因此,您实际上需要使用:

txt = s3.Bucket('bucketname').Object('object.txt').get()['Body'].read().decode('ascii')

(如果这看起来太复杂,那么您可以简单地将文件下载到本地磁盘,然后在文件上使用CSV读取器——不必使用get/read/decode,它就可以很好地工作。)

下一个问题是csv的文档。读者说:

csv.reader(csvfile,方言='excel',**fmtparams)
返回一个读取器对象,该对象将遍历给定csvfile中的行。csvfile可以是任何支持迭代器协议的对象,并在每次调用下一个()方法时返回字符串

由于decode()命令返回一个字符串,因此for循环将迭代字符串中的单个字符,而不是字符串中的行。

坦率地说,您可以在不使用CSV阅读器的情况下处理这些行,只需拆分行和选项卡,如下所示:

import boto3

s3 = boto3.resource('s3')

txt = s3.Bucket('bucketname').Object('object.txt').get()['Body'].read().decode('ascii')

lines = txt.split('\n')

for line in lines:
    fields = line.split('\t')
    print(fields)

通过添加一些调试来查看每个步骤是否返回了预期的数据,例如在每个步骤后打印变量的内容,上述所有问题都应该是显而易见的。

 类似资料:
  • 我在使用Pandas读取选项卡分隔的文件时遇到问题。 所有单元格值都有双引号,但对于某些行,有一个额外的双引号打断了整个过程。例如: 我得到的错误是:错误标记数据。C错误:第8355行预期有31个字段,SAW58 我使用的代码是: 它适用于其余文件,但不适用于出现额外双引号的文件。

  • 问题内容: 我目前有一个CSV文件,当在Excel中打开该文件时,共有5列。仅A和C列对我而言没有任何意义,其余列中的数据无关紧要。 从第8行开始,然后以7的倍数工作(即第8、15、22、29、36行等),我希望使用Python 2.7创建一个字典,其中包含来自这些字段的信息。A列中的数据将是密钥(6位整数),C列中的数据将是密钥的相应值。我试图在下面强调这一点,但格式不是最好的: 如上所述,我正

  • 问题内容: 我有一个txt文件,格式为: 我想将所有键及其值放入创建的hashMap中。如何获得或知道何时在冒号(:)处拆分键和值?:-) 我试过了: 问题答案: 使用逐行读取文件,并针对该行中第一次出现的行执行一次(如果没有,则忽略该行)。 这是一些示例代码-避免使用Scanner(它有一些微妙的行为,恕我直言,实际上比其价值更大的麻烦)。

  • 问题内容: 所以我想将一个简单的制表符分隔的文本文件转换为一个csv文件。如果我使用string.split(’\ n’)将txt文件转换为字符串,则会得到一个列表,其中每个列表项都是字符串,每列之间带有’\ t’。我当时以为我可以用逗号替换’\ t’,但它不会像清单中的字符串一样对待字符串,并允许我使用string.replace。这是我的代码的开始,仍然需要解析选项卡“ \ t”的方法。 问题

  • 我的文件内容如下: 我需要在分隔符“”处拆分我的文件。并将前面的内容保存在字符串中。我怎么能那么做?我尝试了以下方法,但不起作用

  • 目前,我正在逐行读取由制表符分隔的文件,将每行中的项目拆分,并通过硬编码值50查找由50个项目组成的制表符分隔的行,然后创建数据表。 问题:以制表符分隔的源文件在拆分后有时有50或53项以制表符分隔的行。需要直接读取以制表符分隔的源文件中具有最大制表符分隔符的行,然后继续我的逻辑。 我的C代码