Python:以任意数量的制表符作为分隔符读取csv文件

Python:以任意数量的制表符作为分隔符读取csv文件,python,csv,tabs,Python,Csv,Tabs,我将我的csv文件格式化,通过在不同的值之间使用一个或多个选项卡,所有列都很好地对齐 我知道可以使用单个制表符作为csv的分隔符。register\u方言(“制表符”,delimiter=“\t”)。但这仅适用于值之间的一个选项卡。我希望处理文件时保持其格式,即不删除重复的选项卡。每个字段(行、列)都包含一个值 是否可以使用多个1+制表符作为分隔符,或忽略其他制表符而不影响行中值的编号行[1]应该是第二个值,与行[0]之间的选项卡数量无关。假设永远不会有空字段,您可以使用生成器从传入的CSV文件

我将我的csv文件格式化,通过在不同的值之间使用一个或多个选项卡,所有列都很好地对齐

我知道可以使用单个制表符作为csv的分隔符。register\u方言(“制表符”,delimiter=“\t”)。但这仅适用于值之间的一个选项卡。我希望处理文件时保持其格式,即不删除重复的选项卡。每个字段(行、列)都包含一个值


是否可以使用多个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