Python:以任意数量的制表符作为分隔符读取csv文件
我将我的csv文件格式化,通过在不同的值之间使用一个或多个选项卡,所有列都很好地对齐 我知道可以使用单个制表符作为csv的分隔符。register\u方言(“制表符”,delimiter=“\t”)。但这仅适用于值之间的一个选项卡。我希望处理文件时保持其格式,即不删除重复的选项卡。每个字段(行、列)都包含一个值Python:以任意数量的制表符作为分隔符读取csv文件,python,csv,tabs,Python,Csv,Tabs,我将我的csv文件格式化,通过在不同的值之间使用一个或多个选项卡,所有列都很好地对齐 我知道可以使用单个制表符作为csv的分隔符。register\u方言(“制表符”,delimiter=“\t”)。但这仅适用于值之间的一个选项卡。我希望处理文件时保持其格式,即不删除重复的选项卡。每个字段(行、列)都包含一个值 是否可以使用多个1+制表符作为分隔符,或忽略其他制表符而不影响行中值的编号行[1]应该是第二个值,与行[0]之间的选项卡数量无关。假设永远不会有空字段,您可以使用生成器从传入的CSV文件
是否可以使用多个1+制表符作为分隔符,或忽略其他制表符而不影响行中值的编号<代码>行[1]应该是第二个值,与
行[0]
之间的选项卡数量无关。假设永远不会有空字段,您可以使用生成器从传入的CSV文件中删除重复项,然后像往常一样使用CSV
模块:
##Sample.txt
##ID name Age
##1 11 111
##2 22 222
import pandas as pd
df=pd.read_csv('Sample.txt' ,sep=r'\t+')
print df
import csv
def de_dup(f, delimiter='\t'):
for line in f:
yield delimiter.join(field for field in line.split(delimiter) if field)
with open('data.csv') as f:
for row in csv.reader(de_dup(f), delimiter='\t'):
print(row)
另一种方法是在生成器中使用re.sub()
:
import re
def de_dup(f, delimiter='\t'):
for line in f:
yield re.sub(r'{}{{2,}}'.format(delimiter), delimiter, line)
但这仍然有一个限制,即所有字段都必须包含一个值。假设永远不会有空字段,您可以使用生成器从传入的CSV文件中删除重复项,然后像往常一样使用
CSV
模块:
import csv
def de_dup(f, delimiter='\t'):
for line in f:
yield delimiter.join(field for field in line.split(delimiter) if field)
with open('data.csv') as f:
for row in csv.reader(de_dup(f), delimiter='\t'):
print(row)
另一种方法是在生成器中使用re.sub()
:
import re
def de_dup(f, delimiter='\t'):
for line in f:
yield re.sub(r'{}{{2,}}'.format(delimiter), delimiter, line)
但这仍然有一个限制,即所有字段都必须包含一个值。我处理多个选项卡最方便的方法是使用一个附加函数,该函数获取行并删除一行中多个选项卡创建的空值/字段。这不会影响csv文件的格式,我可以使用
行[1]
访问行中的第二个值,即使前面有多个选项卡
def remove_empty(line):
result = []
for i in range(len(line)):
if line[i] != "":
result.append(line[i])
return result
在我读取文件并处理值的代码中:
for row in reader:
row = remove_empty(row)
**continue processing normally**
我认为这个解决方案与mhawke的类似,但使用他的解决方案,我无法像以前那样使用
行[I]
访问相同的值(即,每个值之间只有一个分隔符).对我来说,处理多个选项卡最方便的方法是使用附加函数,该函数获取该行并删除由一行中的多个选项卡创建的空值/字段。这不会影响csv文件的格式,我可以使用行[1]
访问行中的第二个值,即使前面有多个选项卡
def remove_empty(line):
result = []
for i in range(len(line)):
if line[i] != "":
result.append(line[i])
return result
在我读取文件并处理值的代码中:
for row in reader:
row = remove_empty(row)
**continue processing normally**
我认为这个解决方案与mhawke的类似,但使用他的解决方案,我无法像以前那样使用
行[I]
访问相同的值(即,每个值之间只有一个分隔符).或对于任何类型的重复分隔符,完全通用的解决方案是用单个分隔符递归地替换每个多个分隔符,并写入新文件(尽管对于千兆字节大小的CSV文件来说速度较慢):
如果运行以下命令,哪个给定的输入testFile.csv将生成testFile.csv.new,其中的选项卡将替换为管道:
replaceMultipleSeparators( 'testFile.csv', '\t', '|' )
有时,对于某些microsoft US生成的CSV文件,您需要将“utf-8”编码替换为“latin-1”。有关此问题,请参阅与0xe4读取相关的错误。或对于任何类型的重复分隔符,完全通用的解决方案是用单个分隔符递归替换每个多个分隔符,并写入新文件(尽管对于千兆字节大小的CSV文件,速度较慢): 如果运行以下命令,哪个给定的输入testFile.csv将生成testFile.csv.new,其中的选项卡将替换为管道:
replaceMultipleSeparators( 'testFile.csv', '\t', '|' )
有时,对于某些microsoft US生成的CSV文件,您需要将“utf-8”编码替换为“latin-1”。有关此问题,请参阅与0xe4读取相关的错误。读取我收集的文档时,您只能使用单个字符作为分隔符。我想您最好的选择是预处理文件以删除重复的制表符。如果每一行都有每一列的数据,只需使用不同数量的制表符作为分隔符,您就可以使用列表理解
separated=[item for item in row if item]
来处理此问题,其中row
是csv.reader()中的一行
。如果某些行有空白条目,那么我看不到任何方法来实现这一点。阅读我收集的文档,您只能使用单个字符作为分隔符。我想您最好的选择是预处理文件以删除重复的制表符。如果每一行都有每一列的数据,只需使用不同数量的制表符作为分隔符,您就可以使用列表理解separated=[item for item in row if item]
来处理此问题,其中row
是csv.reader()中的一行
。如果某些行有空白条目,那么我看不到任何方法来实现这一点。有没有方法使用csv
而不是pandas
?有没有方法使用csv
而不是pandas
?