当前位置: 首页 > 知识库问答 >
问题:

面临python中“wget”的问题

袁晋鹏
2023-03-14

我是python的新手。我面临“wget”和“urllib.urlretrieve(str(myurl),tail)”的问题

当我运行脚本时,它正在下载文件,但文件名以“”结尾

我的完整代码:

import os
import wget
import urllib
import subprocess
with open('/var/log/na/na.access.log') as infile, open('/tmp/reddy_log.txt', 'w') as outfile:
    results = set()
    for line in infile:
        if ' 200 ' in line:
            tokens = line.split()
            results.add(tokens[6]) # 7th token
    for result in sorted(results):
        print >>outfile, result
with open ('/tmp/reddy_log.txt') as infile:
     results = set()
     for line in infile:
     head, tail = os.path.split(line)
                print tail
                myurl = "http://data.xyz.com" + str(line)
                print myurl
                wget.download(str(myurl))
                #  urllib.urlretrieve(str(myurl),tail)

输出:

# python last.py
0011400026_recap.xml

http://data.na.com/feeds/mobile/android/v2.0/video/games/high/0011400026_recap.xml

latest_1.xml

http://data.na.com/feeds/mobile/iphone/article/league/news/latest_1.xml

currenttime.js

列出文件:

# ls
0011400026_recap.xml?                   currenttime.js?  latest_1.xml?      today.xml?

共有1个答案

养枫涟
2023-03-14

对您所经历的行为的一种可能解释是,您没有对输入进行清理line

with open ('/tmp/reddy_log.txt') as infile:
     ...
     for line in infile:
         ...
         myurl = "http://data.xyz.com" + str(line)
         wget.download(str(myurl))

当你迭代一个文件对象时,(for line in infile:)你得到的字符串被一个换行符('\n')终止——如果你在使用line之前没有删除换行符,哦,换行符仍然存在于您使用line生成的内容中...

作为这个概念的一个例子,看看我做的一个测试的成绩单

08:28 $ cat > a_file
a
b
c
08:29 $ cat > test.py
data = open('a_file')
for line in data:
    new_file = open(line, 'w')
    new_file.close() 
08:31 $ ls
a_file  test.py
08:31 $ python test.py
08:31 $ ls
a?  a_file  b?  c?  test.py
08:31 $ ls -b
a\n  a_file  b\n  c\n  test.py
08:31 $

如您所见,我从文件中读取行,并使用line作为文件名创建一些文件,猜猜看,ls列出的文件名有一个 最后-但是我们可以做得更好,正如ls

  -b, --escape
         print C-style escapes for nongraphic characters

而且,正如您在ls-b的输出中看到的,文件名不是以问号结尾的(它只是ls程序默认使用的占位符),而是以换行符结尾的。

当我这么做的时候,我不得不说你应该避免使用一个临时文件来存储计算的中间结果。

Python的一个很好的特性是生成器表达式的存在,如果您愿意,您可以按如下方式编写代码

import wget

# you matched on a '200' on the whole line, I assume that what
# you really want is to match a specific column, the 'error_column'
# that I symbolically load from an external resource
from my_constants import error_column, payload_column

# here it is a sequence of generator expressions, each one relying
# on the previous one

# 1. the lines in the file, stripped from the white space
#    on the right (the newline is considered white space)
#    === not strictly necessary, just convenient because
#    === below we want to test for non-empty lines
lines = (line.rstrip() for line in open('whatever.csv'))

# 2. the lines are converted to a list of 'tokens' 
all_tokens = (line.split() for line in lines if line)

# 3. for each 'tokens' in the 'all_tokens' generator expression, we
#    check for the code '200' and possibly generate a new target
targets = (tokens[payload_column] for tokens in all_tokens if tokens[error_column]=='200')

# eventually, use the 'targets' generator to proceed with the downloads
for target in targets: wget.download(target)

不要被大量的注释所愚弄,没有注释我的代码只是

import wget
from my_constants import error_column

lines = (line.rstrip() for line in open('whatever.csv'))
all_tokens = (line.split() for line in lines if line)
targets = (tokens[payload_column] for tokens in all_tokens if tokens[error_column]=='200')

for target in targets: wget.download(target)

 类似资料:
  • 我正在尝试安装android studio。在完成安装过程后,当我打开它时。它没有打开。搜索很多关于它的信息,但要找出问题所在。 我面临问题的窗口截图 当我单击finish按钮时,应用程序没有打开。JDK已正确安装在我的笔记本电脑中。我的笔记本电脑的进程是奔腾四核

  • 使用梯度抛出错误的Spring boot应用程序 java.lang.IllegalArgumentException:org.springframework.util.assert.notempty(assert.java:467)~[spring-core-5.3.0-snapshot.jar:5.3.0-snapshot]在org.springframework.boot.springapp

  • agpbi:{“kind”:“error”,“text”:“找不到与给定名称匹配的资源(at\u0027textapplace\u0027 with value\u0027@style/textapparance.appcompate.notification\u0027)”,“sources”:[{“file”:“C:\users\android-2\.android\Build\cache\9

  • [代码链接][1] 我试图使我的导航停留在一点滚动期间使用位置=固定,但它不工作…好心的帮助

  • 蛋白质和非蛋白质是由它们的编码来表示的。 我编写的python程序的目的是从用户那里获取代码,它应该搜索两个数据库表,并判断是否属于蛋白质、非蛋白质或两者都不属于。代码如下: 但是,在输出中,每当我输入一个代码,它只是被归类到一个蛋白质。它从不去“非蛋白质”或“无”部分。你能帮我解释一下为什么会这样吗? 输出如下:

  • (在项目“Pods”的目标“TocropViewController”中)警告:在复制标头生成阶段跳过重复的生成文件:/users/vickky/documents/project1/ios/pods/tocropViewController/views/tocropViewController.h(在项目“Pods”的目标“TocropViewController”中)警告:在复制标头生成阶段跳