Python:使用pandas从csv文件中提取特定列(包含特殊字符)
我有一个文件(tests.txt),其中包含以下格式的数据:Python:使用pandas从csv文件中提取特定列(包含特殊字符),python,csv,pandas,text-formatting,Python,Csv,Pandas,Text Formatting,我有一个文件(tests.txt),其中包含以下格式的数据: NUMBER,\tFilename,\t\t\t\t\tTestName,\t\t\t\tConfig 001,\t\tFile1.csv,\t\tcube,\t\twidth height size 002,\t\tFile2.csv,\t\tsquare,\t\tlength param 通常看起来像: HLM_TIER, Filename, TestName,
NUMBER,\tFilename,\t\t\t\t\tTestName,\t\t\t\tConfig
001,\t\tFile1.csv,\t\tcube,\t\twidth height size
002,\t\tFile2.csv,\t\tsquare,\t\tlength param
通常看起来像:
HLM_TIER, Filename, TestName, Config
001, File1.csv, cube, width height size
002, File2.csv, square, length param
我想从这个文件中提取一个特定的列(TestName)
已尝试的代码:
但是,我得到了以下错误:
回溯(最近一次呼叫最后一次):
文件“C:\Users\temp.py”,第23行,在
TestName=data.TestName
文件“C:\Python27\lib\site packages\pandas\core\generic.py”,第2246行,在\uuu getattr中__
(键入(自身)。\名称\名称)
AttributeError:“DataFrame”对象没有属性“TestName”
我认为错误是由于列中的制表符导致pandas将列读取为“\t\t\t\tTestName\”
但是,我不知道如何解决这个问题。
注意:我无法更改“tests.txt”文件。您可以在读取数据时使用
转换器来剥离数据。为此,您需要创建一个执行此剥离的函数,然后需要将其传递到将列映射到函数的dict中
您还应该使用names
参数手动指定列名,并跳过标题行
范例-
def strip(x):
try:
return x.strip()
except AttributeError:
return x
col_names = ['HLM_TIER', 'Filename', 'TestName', 'Config', ...]
col_mapping = {key:strip for key in col_names}
data = pd.read_csv('tests.txt', names=col_names, converters=col_mapping)
您是否可以删除所有选项卡:
from StringIO import StringIO
with open('test.txt', 'r') as f:
df = pd.read_csv(StringIO(f.read().replace('\t', '')))
df.TestName
如果还包含参数-skipinitialspace=True来读取_csv会发生什么?数据帧不是通过键,data['TestName']
…@AnandSKumar访问的吗?它不起作用。尝试此“data=pd.read\u csv('performance\u tests.txt',skipinitialspace=True”。但是,没有更改。相同的错误或错误是否发生了更改?当您使用不需要条带的打印(data.columns)时,您得到了什么结果。更新了相关代码,请检查。唯一的更改是“skipinitialspace=True”,如建议的那样。让我试着复制您的issue@PrafulS检查最新更新,您需要使用转换器
(或直接阅读csv后的其他处理)。您能解释更多您的答案吗?
def strip(x):
try:
return x.strip()
except AttributeError:
return x
col_names = ['HLM_TIER', 'Filename', 'TestName', 'Config', ...]
col_mapping = {key:strip for key in col_names}
data = pd.read_csv('tests.txt', names=col_names, converters=col_mapping)
from StringIO import StringIO
with open('test.txt', 'r') as f:
df = pd.read_csv(StringIO(f.read().replace('\t', '')))
df.TestName
df = pd.read_csv('Foo.txt', delim_whitespace=True)