简体   繁体   English

如何使用python打印新行中函数返回的输出?

[英]how to print the output returned from a function in new lines using python?

I have 243607 ips in the log file. 我在日志文件中有243607个ips。 the output of a function is displaying unique ips continuously so that i can't able to check whether the output ips are unique. 函数的输出连续显示唯一的ips,因此我无法检查输出ips是否唯一。 So i want each ip to be print in seprate line. 所以我希望每个ip都能在单独的行中打印。 as i'm new to python i can't able to figure it out. 因为我是python的新手,我无法弄明白。 is there any way to do it? 有什么办法吗?

I also want the count of the ips printed 我也想要打印的ips计数

def unique_ips(): 
    f = open('epiclogs.txt','r')
    ips = set(line.split()[0] 
    for line in f:
        if not line.isspace()) 
            ip = line.split()[0] 
            ips.add(ip) 

    return ips

if name__=='__main':
    print unique_ips() 

The requirements are not complete: 要求不完整:

  1. The format of the log file is unknown. 日志文件的格式未知。
  2. The format of the output file (eg sorted?) 输出文件的格式(例如排序?)

My assumptions 我的假设

  1. The IP addresses are located in the first column IP地址位于第一列
  2. The output format should be '[count] [ip address]' 输出格式应为'[count] [ip address]'

Test data 测试数据

10.1.10.190 http://example.com/t1 404
10.1.10.171 http://example.com/t1 404

10.1.10.180 http://example.com/t2 200
10.1.10.190 http://example.com/t1 404
10.1.11.180 http://example.com/t3 302

Program 程序

#!/usr/bin/env python
# 
# Counts the IP addresses of a log file.
# 
# Assumption: the IP address is logged in the first column.
# Example line: 10.1.10.190 http://example.com/t1 404
#

import sys

def extract_ip(line):
    '''Extracts the IP address from the line.
       Currently it is assumed, that the IP address is logged in
       the first column and the columns are space separated.'''
    return line.split()[0]

def increase_count(ip_dict, ip_addr):
    '''Increases the count of the IP address.
       If an IP address is not in the given dictionary,
       it is initially created and the count is set to 1.'''
    if ip_addr in ip_dict:
        ip_dict[ip_addr] += 1
    else:
        ip_dict[ip_addr] = 1

def read_ips(infilename):
    '''Read the IP addresses from the file and store (count)
       them in a dictionary - returns the dictionary.'''
    res_dict = {}
    log_file = file(infilename)
    for line in log_file:
        if line.isspace():
            continue
        ip_addr = extract_ip(line)
        increase_count(res_dict, ip_addr)
    return res_dict

def write_ips(outfilename, ip_dict):
    '''Write out the count and the IP addresses.'''
    out_file = file(outfilename, "w")
    for ip_addr, count in ip_dict.iteritems():
        out_file.write("%5d\t%s\n" % (count, ip_addr))
    out_file.close()

def parse_cmd_line_args():
    '''Return the in and out file name.
       If there are more or less than two parameters,
       an error is logged in the program is exited.'''
    if len(sys.argv)!=3:
        print("Usage: %s [infilename] [outfilename]" % sys.argv[0])
        sys.exit(1)
    return sys.argv[1], sys.argv[2]

def main():
    infilename, outfilename = parse_cmd_line_args()
    ip_dict = read_ips(infilename)
    write_ips(outfilename, ip_dict)

if __name__ == "__main__":
    main()

Comment 评论

I like small functions - each of them does exactly one thing. 我喜欢小功能 - 每个功能都只做一件事。 IMHO this makes the program easier to understand. 恕我直言,这使程序更容易理解。

Havn't checked your code works or not, but added new lines to it, which can achieve your task. 没有检查你的代码是否有效,但是添加了新的代码,这可以完成你的任务。

try this, 尝试这个,

def unique_ips(): 
    f = open('epiclogs.txt','r')
    fout = open('uniqueip.txt','w') # Added
    ips = set(line.split()[0] 
    for line in f:
        if not line.isspace()): 
            ip = line.split()[0] 
            ips.add(ip) 
            fout.write("%s\n"%ip) # Added
    f.close() # Added
    fout.flush() # Added
    fout.close() # Added
    return ips

if name__=='__main':
    print unique_ips() 

unique_ips() returns a set , which means each IP address only appears once. unique_ips()返回一个set ,这意味着每个IP地址只出现一次。 If you want to see the addresses line by line in a file, you can change the print unique_ips() line to: 如果要在文件中逐行查看地址,可以将print unique_ips()行更改为:

if __name__== '__main__':
    f = file('ip_addresses', 'w')
    for ip in unique_ips():
        f.write(ip + '\n')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM