打印值的Python方式

打印值的Python方式,python,Python,这可能衡量你有多像蟒蛇。我一直在努力学习python,所以我还不够精通python。infle是一个虚拟的patriline,我想要一个父子名单 填充: haffi jolli dkkdk lkskkk lkslll sdkjl kljdsfl klsdlj sdklja asldjkl 代码: 问题是i+1;我想每行打印两个字符串。这清楚吗?您正在混淆拆分字符串中的单词及其索引。例如,第一个单词是“haffi”,但第一个索引是0 要迭代索引及其对应的单词,请使用enumerate: for

这可能衡量你有多像蟒蛇。我一直在努力学习python,所以我还不够精通python。infle是一个虚拟的patriline,我想要一个父子名单

填充:

haffi jolli dkkdk lkskkk lkslll sdkjl kljdsfl klsdlj sdklja asldjkl
代码:


问题是
i+1
;我想每行打印两个字符串。这清楚吗?

您正在混淆拆分字符串中的单词及其索引。例如,第一个单词是“haffi”,但第一个索引是0

要迭代索引及其对应的单词,请使用enumerate:

for i, word in enumerate(tmpstr):
    print word, tmpstr[i+1]
当然,这看起来很混乱。一种更好的方法是在字符串对上迭代。有很多方法可以做到这一点;这里有一个

def pairs(it):
    it = iter(it)
    for element in it:
        yield element, next(it)

for word1, word2 in pairs(tmpstr):
    print word1, word2

您可以在文件读取和打印方面更具Python风格。试试这个:

def main():
    with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as f:
        strings = f.readline().split('\t')
    for i, word in enumerate(strings):
        print "{} \t {}".format(word, strings[i+1:i+2])
main()

使用
字符串[i+1:i+2]
可以确保在试图到达列表末尾的
i+1
第个索引时不会抛出
索引器(而是返回
[]
)。它有一个好处,就是当输入奇数个项目时不会崩溃,但当然你可能更喜欢这种情况下的例外

def main():
    with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as infile:
        line = infile.readline()
        previous = None
        for i in line.split('\t'):
            if previous is None:
                previous = i
            else:
                print previous, '\t', i
                previous = None

不过,我不会说这是pythonic。

我会在这里使用with语句,如果您使用的是较旧版本的python,则需要导入:

from __future__ import with_statement
对于实际代码,如果您能够将整个文件加载到内存中两次(即,它非常小),我会这样做:

def main():
    with open('C:\Users\Notandi\Desktop\patriline.txt', 'r') as f:
        strings = f.read().split('\t')
    for father, son in zip(string, string[1:]):
        print "%s \t %s" % (father, son)
main()
这样你就可以跳过最后一行,而不会有太多的开销,不会在末尾包含没有孩子的叶子,这就是你想要的(?)

有点相切:如果文件非常大,您可能不想将整个内容加载到内存中,在这种情况下,您可能需要一个生成器。如果您实际上正在打印所有内容,则可能不需要执行此操作,但如果这是问题的简化版本,我将采用以下方法制作生成器来拆分文件:

class reader_and_split():
    def __init__(self, fname, delim='\t'):
        self.fname = fname
        self.delim = delim
    def __enter__(self):
        self.file = open(self.fname, 'r')
        return self.word_generator()
    def __exit__(self, type, value, traceback):
        self.file.close()
    def word_generator(self):
        current = []
        while True:
            char = self.file.read(1)
            if char == self.delim:
                yield ''.join(current)
                current = []
            elif not char:
                break
            else:
                current.append(char)
生成器的价值在于,在运行拆分之前,不将文件的全部内容加载到内存中,这对于非常非常大的文件来说可能非常昂贵。为了简单起见,此实现只允许使用单字符分隔符。这意味着您只需使用生成器即可解析所有内容,一种快速的方法是:

with reader_and_split(fileloc) as f:
    previous = f.next()
    for word in f:
        print "%s \t %s" % (previous, word)
        previous = word

拒绝投票,不评论为什么,这是一个多么可怕的习惯…@胡里奥:非常正确。在这种情况下,您只能勉强侥幸逃脱,但是单引号和双引号Python字符串中的反斜杠引入了转义代码。如果文件名为,例如“other.txt”,则
\a
将被转换为不可打印字符,文件将无法打开。养成将反斜杠加倍或在Windows文件路径中使用以r为前缀的原始字符串(
r“C:\blahblah\whatever.txt”
)的习惯。即使在Windows上,您也可以在文件路径中使用前斜杠。您可以在阅读后立即关闭
f
。据我所知,没有理由等到
打印
循环之后。你说得对,谢谢。我用
语句把它清理干净了。很好。另外,我刚刚注意到
.format()
的大量使用!我认为您必须在大括号内指定索引,但我想现在可以隐式确定它了。
with reader_and_split(fileloc) as f:
    previous = f.next()
    for word in f:
        print "%s \t %s" % (previous, word)
        previous = word