我有一个带有\ n EOL字符的制表符分隔文件,如下所示:
User Name\tCode\tTrack\tColor\tNote\n\nUser Name2\tCode2\tTrack2\tColor2\tNote2\n
我正在使用此输入文件并使用split('\t')
将其重新格式化为嵌套列表。列表应如下所示:
[['User Name','Code','Track','Color','Note'],
['User Name2','Code2','Track2','Color2','Note2']]
生成文件的软件允许用户按"输入"在填写"注意"领域。它还允许用户按"输入"创建任意数量的换行而不在"注意"中输入任何可见文本。现场。
最后,用户可以按"输入"在" Note"中间的任意次数;创建多个段落,但从操作的角度来看,这种情况很少发生,如果它使代码复杂化,我愿意留下这种可能性。这种可能性确实非常低优先级。
如上例所示,这些操作可能导致一系列" \ n \ n ..."任何长度的代码,包括"注意"领域。或者这样说,在将文件对象放入列表之前,需要进行以下替换:
\t\n\n... preceding "Note" must become \t
\n\n... trailing "note" must become \n
\n\n... in place of "note" must become \n
\n\n... in the middle of the text note must become a single whitespace, if easy to do
我尝试过使用strip()和replace()方法但没有成功。在可以对其使用replace()方法之前,是否需要先将文件对象复制到其他对象中?
我有使用Awk的经验,但我希望不需要正则表达式,因为我对Python很新。这是我需要改进的代码,以便解决多个换行符:
marker = [i.strip() for i in open('SomeFile.txt', 'r')]
marker_array = []
for i in marker:
marker_array.append(i.split('\t'))
for i in marker_array:
print i
答案 0 :(得分:4)
计算标签;如果你假设音符字段中的一行上没有4个标签,你可以收集音符,直到找到 中有4个标签的行:
def collapse_newlines(s):
# Collapse multiple consecutive newlines into one; removes trailing newlines
return '\n'.join(filter(None, s.split('\n')))
def read_tabbed_file(filename):
with open(filename) as f:
row = None
for line in f:
if line.count('\t') < 4: # Note continuation
row[-1] += line
continue
if row is not None:
row[-1] = collapse_newlines(row[-1])
yield row
row = line.split('\t')
if row is not None:
row[-1] = collapse_newlines(row[-1])
yield row
上述生成器函数在确定下一行没有继续记录之前不会产生一行,从而有效地向前看。
现在使用read_tabbed_file()
函数作为生成器并循环结果:
for row in read_tabbed_file(yourfilename):
# row is a list of elements
演示:
>>> open('/tmp/test.csv', 'w').write('User Name\tCode\tTrack\tColor\tNote\n\nUser Name2\tCode2\tTrack2\tColor2\tNote2\n')
>>> for row in read_tabbed_file('/tmp/test.csv'):
... print row
...
['User Name', 'Code', 'Track', 'Color', 'Note']
['User Name2', 'Code2', 'Track2', 'Color2', 'Note2']
答案 1 :(得分:1)
您遇到的第一个问题是in
- 它试图提供帮助,并且一次从文件中读取一行文本。
>>> [i for i in open('SomeFile.txt', 'r') ]
['User Name\tCode\tTrack\tColor\tNote\n', '\n', 'User Name2\tCode2\tTrack2\tColor2\tNote2\n', '\n']
添加对.strip()
的调用确实会从每一行中删除空白,但这会留下空行 - 它不会将这些空元素从列表中删除。
>>> [i.strip() for i in open('SomeFile.txt', 'r') ]
['User Name\tCode\tTrack\tColor\tNote', '', 'User Name2\tCode2\tTrack2\tColor2\tNote2', '']
但是,你可以在if
子句中提供列表理解,使其只删除只有换行符的行:
>>> [i.strip() for i in open('SomeFile.txt', 'r') if len(i) >1 ]
['User Name\tCode\tTrack\tColor\tNote', 'User Name2\tCode2\tTrack2\tColor2\tNote2']
>>>
答案 2 :(得分:0)
我认为,csv模块会对你有帮助。