我试图读取一个标签分隔值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']
你的代码有几个问题。
首先,对象。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代码