这是我以前的问题的延续(如果你好奇,请检查它们) 我已经可以看到隧道尽头的灯光,但我有一个最后的问题。
出于某种原因,每一行都以一个TAB字符开头 如何忽略第一个字符(在我的情况下为“tab”(\ t))?
filename = "terem.txt"
OraRend = collections.namedtuple('OraRend', 'Nap, OraKezdese, OraBefejezese, Azonosito, Terem, OraNeve, Emelet')
csv.list_dialects()
for line in csv.reader(open(filename, "rb"), delimiter='\t', lineterminator='\t\t', doublequote=False, skipinitialspace=True):
print line
orar = OraRend._make(line) # Here comes the trouble!
文本文件:
http://pastebin.com/UYg4P4J1
(无法将所有选项卡粘贴在此处。)
我找到了lstrip,strip和其他方法,所有这些方法都会占用 all 字符,因此元组的填充会失败。
答案 0 :(得分:5)
你可以做line = line[1:]
来剥离第一个字符。但是如果你这样做,你应该添加一个断言,第一个字符确实是一个标签,以避免在没有前导标签的情况下修改数据。
还有一个更容易的替代方案,它也可以处理其他几个案例,并且如果要删除的东西不存在则不会破坏。您可以使用line = line.strip()
删除所有前导和尾随空格。或者,使用.lstrip()
仅去除前导空格,并将'\t'
作为参数添加到任一方法调用中,如果要将其他空格留在原位并只删除制表符。
答案 1 :(得分:2)
从字符串中删除第一个字符:
>>> s = "Hello"
>>> s
'Hello'
>>> s[1:]
'ello'
答案 2 :(得分:1)
来自文档:
str.lstrip([字符])
返回删除了前导字符的字符串副本。字符 参数是一个指定的字符串 要删除的字符集。如果 省略或无,chars参数 默认删除空格。该 chars参数不是前缀; 相反,它的价值的所有组合 被剥夺
如果您只想删除行首的标签,请使用
str.lstrip("\t")
这样做的好处是您无需检查以确保第一个字符实际上是一个选项卡。但是,如果存在多个标签的情况,并且您希望保留第二个标签,则必须使用str[1:]
。
答案 3 :(得分:0)
考虑一下。您不需要将“文件”传递给csv.reader。作为字符串值序列的文件行对象可以很好地工作。
filename = "terem.txt"
OraRend = collections.namedtuple('OraRend', 'Nap, OraKezdese, OraBefejezese, Azonosito, Terem, OraNeve, Emelet')
with open(filename, "rb") as source:
cleaned = ( line.lstrip() for line in source )
rdr= csv.reader( cleaned, delimiter='\t', lineterminator='\t\t', doublequote=False, skipinitialspace=True)
for line in rdr
print line
orar = OraRend._make(line) # Here comes the trouble!