我真的是python的新手,由于某种原因,这使我感到困扰了一段时间,所以我想寻求帮助。
我正在研究一个python脚本,该脚本允许我读取文件,但是如果行末尾有'\',它将在其后加入行。
因此,如果这些行如下所示:
: Student 1
: Student 2 \
Student 3
任何没有冒号的行,如果前一行有'\',我想将它们组合成这样:
: Student 2 Student 3
这是我尝试过的:
s = ""
if line.endswith('\\'):
s.join(line) ## line being the line read from the file
任何在严格方向上的帮助都是很好的
答案 0 :(得分:1)
s.join
并没有您认为的那样。还要考虑到文件中的行具有换行符('\n'
),因此.endswith('\\')
不会因为这个原因而被捕获。
类似的东西(尽管方法有所不同)
output = ''
with open('/path/to/file.txt') as f:
for line in f:
if line.rstrip().endswith('\\'):
next_line = next(f)
line = line.rstrip()[:-1] + next_line
output += line
在上面,我们使用line.rstrip()
来读取任何结尾的空格(换行符),以便.endswith
方法可以正确匹配。
如果一行以\
结尾,我们将继续使用内置函数next
将下一行从文件生成器中拉出。
最后,我们将行和下一行结合起来,注意再次删除空白(.rstrip()
)和\
字符([:-1]
表示直到最后一个字符的所有字符)然后将新行添加到输出中。
结果字符串像这样打印出来
: Student 1
: Student 2 Student 3
关于s.join
的注释...最好用split
作为分隔符(或连接符)解释为与s
相反。
>>> "foo.bar.baz".split('.')
['foo', 'bar', 'baz']
>>> "|".join(['foo', 'bar', 'baz'])
'foo|bar|baz'
答案 1 :(得分:0)
如果您可以读取完整文件而不将其分成几行,则可以使用正则表达式:
import re
text = """
: Student 1
: Student 2 \
Student 3
""".strip()
print(re.sub(r'\\\s*\n[^:]', ' ', text))
: Student 1
: Student 2 Student 3
正则表达式匹配\
的出现,后跟换行和不是:
的内容。
答案 2 :(得分:0)
如果以字符串列表开头,则可以使用var s = "foo\nbar\nbob";
console.log(
s.replace(/\n/g, String.raw`\
`) // template literal contains one backslash, followed by one newline
);
和regex
来避免循环。
join
输出:
l = ['a\\', 'b','c']
s = '_'.join(l)
lx = re.split(r'(?<!\\)_', s) # use negative lookbehind to only split underscore with no `\` before it
[e.replace('\\_', '') for e in lx] # replace with '', ' ' if you need so.