Python:使用任意数量的选项卡读取csv文件作为分隔符

时间:2016-10-24 10:21:51

标签: python csv tabs

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

我知道可以使用单个标签作为csv.register_dialect("tab_delimiter", delimiter="\t")的分隔符。但这仅适用于值之间的exaclty one选项卡。我想处理保持其格式的文件,即不删除重复的标签。每个字段(行,列)都包含一个值。

是否可以使用多个1+标签作为分隔符或忽略其他标签而不影响连续值的编号? row[1]应该是第二个值,与row[0]之间的标签数量无关。

4 个答案:

答案 0 :(得分:2)

##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

答案 1 :(得分:2)

假设永远不会有空字段,您可以使用生成器从传入的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)

但仍然存在所有字段必须包含值的限制。

答案 2 :(得分:0)

我处理多个标签的最方便的方法是使用一个附加功能,该功能获取行并删除由一行中的多个标签创建的空值/字段。这不会影响csv文件的格式化,我可以使用row[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,但是使用他的解决方案,我无法像以前一样使用row[i]访问相同的值(即每个值之间只有一个分隔符)。

答案 3 :(得分:0)

对于任何类型的重复分隔符,完全通用的解决方案是通过单个分隔符递归替换每个多个分隔符并写入新文件(尽管对于千兆字节大小的CSV文件来说速度很慢):

Price <- data %>%
  select(WEEK, price_per_ounce)

test <- transform(Price, Total = ave(price_per_ounce, WEEK, FUN = cumsum))

test <- head(test, 100)
#dput(test)

df <- test[, Total[.N], WEEK]$V1
df <- as.data.frame(df)
df <- head(df, 14)
dput(df)

给出输入testFile.csv将生成testFile.csv.new,如果你运行,TAB被PIPE替换:

def replaceMultipleSeparators( fileName, oldSeparator, newSeparator ):
  linesOfCsvInputFile = open( fileName, encoding='utf-8', mode='r' ).readlines()

  csvNewFileName = fileName + ".new"
  print('Writing:   %s replacing %s with %s' % ( csvNewFileName, oldSeparator, newSeparator ) , end='' )
  outputFileStream = open( newFileName, 'w' )
  for line in linesOfCsvInputFile:
    newLine = line.rstrip()
    processedLine = ""
    while newLine != processedLine:
      processedLine = newLine
      newLine = processedLine.replace( oldSeparator + oldSeparator, oldSeparator )
    newLine = newLine.replace( oldSeparator, newSeparator )
    outputFileStream.write( newLine + '\n' )
  outputFileStream.close()

有时您需要更换&ut; -8&#39;使用&#39; latin-1&#39;进行编码对于一些微软美国生成的CSV文件。请参阅此问题与0xe4读数相关的错误。