① python怎樣接收參數
Python中函數參數的傳遞是通過「賦值」來傳遞的,函數參數的接收傳遞有四種形式:
1. F(arg1,arg2,...)
2. F(arg2=,arg3=...)
3. F(*arg1)
4. F(**arg1)
第1
種方式是最「傳統」的方式:一個函數可以定義不限個數參數,參數(形式參數)放在跟在函數名後面的小括弧中,各個參數之間以逗號隔開。用這種方式定義的函數在調用的時候也必須在函數名後的小括弧中提供相等個數的值(實際參數),不能多也不能少,而且順序還必須相同。也就是說形參和實參的個數必須一致,而且想給形參1的值必須是實參中的第一位,形參與實參之間是一一對應的關系,即「形參1=實參1
形參2=實參2...」。很明顯這是一種非常不靈活的形式。比如:"def addOn(x,y): return x +
y",這里定義的函數addOn,可以用addOn(1,2)的形式調用,意味著形參x將取值1,主將取值2。addOn(1,2,3)和addOn
(1)都是錯誤的形式。
第2種方式比第1種方式好一點,在定義的時候已經給各個形參定義了默認值。因此,在調用這種函數時,如果沒有給對應的形式參數傳遞實參,那麼這個形參就將使用默認值。比如:「def
addOn(x=3,y=5): return x +
y」,那麼addOn(6,5)的調用形式表示形參x取值6,y取值5。此外,addOn(7)這個形式也是可以的,表示形參x取值7,y取默認值5。這時候會出現一個問題,如果想讓x取默認值,用實參給y賦值怎麼辦?前面兩種調用形式明顯就不行了,這時就要用到Python中函數調用方法的另一大絕招
──關健字賦值法。可以用addOn(y=6),這時表示x取默認值3,而y取值6。這種方式通過指定形式參數可以實現可以對形式參數進行「精確攻擊」,一個副帶的功能是可以不必遵守形式參數的前後順序,比如:addOn(y=4,x=6),這也是可以的。這種通過形式參數進行定點賦值的方式對於用第1種方式定義的函數也是適用的。
上面兩種方式定義的形式參數的個數都是固定的,比如定義函數的時候如果定義了5個形參,那麼在調用的時候最多也只能給它傳遞5個實參。但是在實際編程中並不能總是確定一個函數會有多少個參數。第3種方式就是用來應對這種情況的。它以一個*加上形參名的方式表示,這個函數實際參數是不一定的,可以是零個,也可以是N個。不管是多少個,在函數內部都被存放在以形參名為標識符的tuple中。比如:
對這個函數的調用addOn() addOn(2) addOn(3,4,5,6)等等都是可以的。
與第3種方式類似,形參名前面加了兩個*表示,參數在函數內部將被存放在以形式名為標識符的dictionary中。這時候調用函數必須採用key1=value1、key2=value2...的形式。比如:
1. def addOn(**arg):
2. sum = 0
3. if len(arg) == 0: return 0
4. else:
5. for x in arg.itervalues():
6. sum += x
7. return sum
那麼對這個函數的調用可以用addOn()或諸如addOn(x=4,y=5,k=6)等的方式調用。
上面說了四種函數形式定義的方式以及他們的調用方式,是分開說的,其實這四種方式可以組合在一起形成復雜多樣的形參定義形式。在定義或調用這種函數時,要遵循以下規則:
1. arg=必須在arg後
2. *arg必須在arg=後
3. **arg必須在*arg後
在函數調用過程中,形參賦值的過程是這樣的:
首先按順序把「arg」這種形式的實參給對應的形參
第二,把「arg=」這種形式的實參賦值給形式
第三,把多出來的「arg」這種形式的實參組成一個tuple給帶一個星號的形參
第四,把多出來的「key=value」這種形式的實參轉為一個dictionary給帶兩個星號的形參。
聽起來好復雜,實際是是很簡單的。很直觀,來看例子:
1. def test(x,y=5,*a,**b):
2. print x,y,a,b
就這么一個簡單函數,來看看下面對這個函數調用會產生什麼結果:
test(1) ===> 1 5 () {}
test(1,2) ===> 1 2 () {}
test(1,2,3) ===> 1 2 (3,) {}
test(1,2,3,4) ===> 1 2 (3,4)
test(x=1) ===> 1 5 () {}
test(x=1,y=1) ===> 1 1 () {}
test(x=1,y=1,a=1) ===> 1 1 () {'a':1}
test(x=1,y=1,a=1,b=1) ===> 1 1 () {'a':1,'b':1}
test(1,y=1) ===> 1 1 () {}
test(1,2,y=1) ===> 出錯,說y給賦了多個值
test(1,2,3,4,a=1) ===> 1 2 (3,4) {'a':1}
test(1,2,3,4,k=1,t=2,o=3) ===> 1 2 (3,4) {'k':1,'t':2,'o':3}
② python參數,解包,變數!
"from sys import argv" 這一行允許你使用argv這個內建變數。你看這個argv其實在下一行中未經定義就使用了,這就是import的作用所在。
script, first, second, third = argv 簡單說來,運行這一行的結果是,script是腳本(xxx.py)文件名,first, second, third分別是第1,2,3個命令行參數。
對於命令「python ex13.py 1 2 3",得到的結果應該是script - 'ex13.py', first - '1', second - '2', third - '3'
命令行參數只是一種習慣用法,本身沒有任何神秘之處。如果題主實在不知道」我為啥要用到這玩意?「,我的建議是先放一下,知道有這么回事,等以後用到的時候就自然理解了。
③ python調用系統參數問題
import sys
def spfile(infile,linesize=1000):
sp_file = open(infile,'r')
flag = True
i = 1
c = 0
while flag:
if i <= linesize:
line = sp_file.readline()
out_file='outfile_' + str(c) + '.txt'
open(out_file,'a').write(line)
i+=1
elif len(line)==0:
flag=False
else:
i=1
c+=1
continue
if __name__ == '__main__':
spfile(sys.argv[0], int(sys.argv[1]))
④ python怎麼獲得文件夾名字
本文採用os.walk()和os.listdir()兩種方法,獲取指定文件夾下的文件名。
一、os.walk()
模塊os中的walk()函數可以遍歷文件夾下所有的文件。
[python] view plain
os.walk(top, topdown=Ture, onerror=None, followlinks=False)
該函數可以得到一個三元tupple(dirpath, dirnames, filenames).
參數含義:
dirpath:string,代表目錄的路徑;
dirnames:list,包含了當前dirpath路徑下所有的子目錄名字(不包含目錄路徑);
filenames:list,包含了當前dirpath路徑下所有的非目錄子文件的名字(不包含目錄路徑)。
注意,dirnames和filenames均不包含路徑信息,如需完整路徑,可使用os.path.join(dirpath, dirnames)
下面給出代碼;
[python] view plain
# -*- coding: utf-8 -*-
import os
def file_name(file_dir):
for root, dirs, files in os.walk(file_dir):
print(root) #當前目錄路徑
print(dirs) #當前路徑下所有子目錄
print(files) #當前路徑下所有非目錄子文件
當需要特定類型的文件時,代碼如下:
[python] view plain
# -*- coding: utf-8 -*-
import os
def file_name(file_dir):
L=[]
for root, dirs, files in os.walk(file_dir):
for file in files:
if os.path.splitext(file)[1] == '.jpeg':
L.append(os.path.join(root, file))
return L
其中os.path.splitext()函數將路徑拆分為文件名+擴展名,例如os.path.splitext(「E:/lena.jpg」)將得到」E:/lena「+".jpg"。
二、os.listdir()
os.listdir()函數得到的是僅當前路徑下的文件名,不包括子目錄中的文件,所有需要使用遞歸的方法得到全部文件名。
直接給出代碼,函數將返回類型為『.jpeg』個文件名:
[python] view plain
# -*- coding: utf-8 -*-
import os
def listdir(path, list_name):
for file in os.listdir(path):
file_path = os.path.join(path, file)
if os.path.isdir(file_path):
listdir(file_path, list_name)
elif os.path.splitext(file_path)[1]=='.jpeg':
list_name.append(file_path)
⑤ python參數如果是xml字元串,該怎麼寫
調用Python腳本時傳遞XML字元串作為參數可能會導致錯誤,因為某些特殊字元可能被操作系統或Python解釋器解釋為命令或代碼。為配備升了避免這個問題,可以將XML字元串作為滾枝一個文本文件傳遞,或者使用base64編碼將字元串編碼為非特殊字元。下面是兩種方法的示例。
方法一:將XML字元串保存到文件,並將文件名作為參數傳遞:
將XML字元串保存到一個文件,例如input.xml。
修改Python腳本以接受文件名培老作為參數:
import sys
import xml.etree.ElementTree as ET
filename = sys.argv[1]
with open(filename, 'r') as file:
xml_string = file.read()
xml_root = ET.fromstring(xml_string)
調用腳本時傳遞文件名:python xxx.py input.xml
方法二:使用base64編碼:
對XML字元串進行base64編碼:
import base64
xml_string = '<?xml version="1.0" encoding="UTF-8"?>...'
encoded_xml = base64.b64encode(xml_string.encode()).decode()
修改Python腳本以接受base64編碼的字元串作為參數:
import sys
import base64
import xml.etree.ElementTree as ET
encoded_xml = sys.argv[1]
decoded_xml = base64.b64decode(encoded_xml.encode()).decode()
xml_root = ET.fromstring(decoded_xml)
調用腳本時傳遞base64編碼的字元串:python xxx.py "base64_encoded_string"
以上兩種方法都可以有效地避免在傳遞XML字元串時產生的錯誤。請根據實際需求選擇合適的方法。
⑥ 怎麼把文件名以參數的方式傳入python腳本
作為一名從小就看籃球的球迷,會經常逛虎撲籃球及濕乎乎等論壇,在論壇裡面會存在很多精美圖片,包括NBA球隊、CBA明星、枝好花邊新聞、球鞋美女等等,如果一張張右鍵另存為的話真是手都點疼了。作為程序員還是寫個程序來進行吧!
所以我通過Python+Selenium+正則表達式+urllib2進行海量圖片爬取。
運行效果:
http://photo.hupu.com/nba/tag/馬刺
http://photo.hupu.com/nba/tag/陳露
源代碼:
# -*- coding: utf-8 -*-
"""
Crawling pictures by selenium and urllib
url: 虎撲 馬刺 http://photo.hupu.com/nba/tag/%E9%A9%AC%E5%88%BA
url: 虎撲 陳露 http://photo.hupu.com/nba/tag/%E9%99%88%E9%9C%B2
Created on 2015-10-24
@author: Eastmount CSDN
"""
import time
import re
import os
import sys
import urllib
import shutil
import datetime
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.action_chains import ActionChains
#Open PhantomJS
driver = webdriver.PhantomJS(executable_path="G:phantomjs-1.9.1-windowsphantomjs.exe")
#driver = webdriver.Firefox()
wait = ui.WebDriverWait(driver,10)
#Download one Picture By urllib
def loadPicture(pic_url, pic_path):
pic_name = os.path.basename(pic_url) #刪除路徑獲取圖片名字
pic_name = pic_name.replace('*','') #去除'*' 防止錯誤 invalid mode ('wb') or filename
urllib.urlretrieve(pic_url, pic_path + pic_name)
#爬猛敗鉛取具體的圖片及下一張
def getScript(elem_url, path, nums):
try:
#由於鏈接 http://photo.hupu.com/nba/p29556-1.html
#只需拼接 http://..../p29556-數字.html 省略了自動點擊"下一張"操作
count = 1
t = elem_url.find(r'.html')
while (count <= nums):
html_url = elem_url[:t] + '-' + str(count) + '.html'
#print html_url
'''
driver_pic.get(html_url)
elem = driver_pic.find_element_by_xpath("//div[@class='pic_bg']/div/img")
url = elem.get_attribute("src")
'''
#採用正則表達式獲取第3個<div></div> 再獲取枯數圖片URL進行下載
content = urllib.urlopen(html_url).read()
start = content.find(r'<div class="flTab">')
end = content.find(r'<div class="comMark" style>')
content = content[start:end]
div_pat = r'<div.*?>(.*?)</div>'
div_m = re.findall(div_pat, content, re.S|re.M)
#print div_m[2]
link_list = re.findall(r"(?<=href=").+?(?=")|(?<=href=').+?(?=')", div_m[2])
#print link_list
url = link_list[0] #僅僅一條url鏈接
loadPicture(url, path)
count = count + 1
except Exception,e:
print 'Error:',e
finally:
print 'Download ' + str(count) + ' pictures
'
#爬取主頁圖片集的URL和主題
def getTitle(url):
try:
#爬取URL和標題
count = 0
print 'Function getTitle(key,url)'
driver.get(url)
wait.until(lambda driver: driver.find_element_by_xpath("//div[@class='piclist3']"))
print 'Title: ' + driver.title + '
'
#縮略圖片url(此處無用) 圖片數量 標題(文件名) 注意順序
elem_url = driver.find_elements_by_xpath("//a[@class='ku']/img")
elem_num = driver.find_elements_by_xpath("//div[@class='piclist3']/table/tbody/tr/td/dl/dd[1]")
elem_title = driver.find_elements_by_xpath("//div[@class='piclist3']/table/tbody/tr/td/dl/dt/a")
for url in elem_url:
pic_url = url.get_attribute("src")
html_url = elem_title[count].get_attribute("href")
print elem_title[count].text
print html_url
print pic_url
print elem_num[count].text
#創建圖片文件夾
path = "E:\Picture_HP\" + elem_title[count].text + "\"
m = re.findall(r'(w*[0-9]+)w*', elem_num[count].text) #<a href="http://www.aspku.com/tech/jiaoben/%3Ca%20href=" tech="" jiaoben="" python="" 270537.html"="" style="background: none; border: none; padding: 0px; margin: 0px; text-decoration: none; font-family: Tahoma, Geneva, sans-serif; color: rgb(59, 89, 152);">python/95398.html">爬蟲圖片張數
nums = int(m[0])
count = count + 1
if os.path.isfile(path): #Delete file
os.remove(path)
elif os.path.isdir(path): #Delete dir
shutil.rmtree(path, True)
os.makedirs(path) #create the file directory
getScript(html_url, path, nums) #visit pages
except Exception,e:
print 'Error:',e
finally:
print 'Find ' + str(count) + ' pages with key
'
#Enter Function
def main():
#Create Folder
basePathDirectory = "E:\Picture_HP"
if not os.path.exists(basePathDirectory):
os.makedirs(basePathDirectory)
#Input the Key for search str=>unicode=>utf-8
key = raw_input("Please input a key: ").decode(sys.stdin.encoding)
print 'The key is : ' + key
#Set URL List Sum:1-2 Pages
print 'Ready to start the Download!!!
'
starttime = datetime.datetime.now()
num=1
while num<=1:
#url = 'http://photo.hupu.com/nba/tag/%E9%99%88%E9%9C%B2?p=2&o=1'
url = 'http://photo.hupu.com/nba/tag/%E9%A9%AC%E5%88%BA'
print '第'+str(num)+'頁','url:'+url
#Determine whether the title contains key
getTitle(url)
time.sleep(2)
num = num + 1
else:
print 'Download Over!!!'
#get the runtime
endtime = datetime.datetime.now()
print 'The Running time : ',(endtime - starttime).seconds
main()
⑦ python的文件格式有兩種,"*.py"和"*.pyw",它們有什麼不同
它們之間的不同就只有一個:視窗運行它們的時候調用不同的執行檔案。
視窗用 python.exe 運行 .py ,用 pythonw.exe 運行 .pyw 。
這純粹是因為安裝視窗版 Python 時,擴展名 .py 自動被登記為用 python.exe 運行的文件,而 .pyw 則被登記為用 pythonw.exe 運行。
主要體現在win平台上開發桌面程序,linux木有哦 python.exe 運行 .py ,用 pythonw.exe 運行 .pyw,不出現dos窗口, 住:純圖形界面程序的用戶不需要看到dos窗口。
(7)python文件名參數擴展閱讀
Python open() 方法用於打開一個文件,並返迴文件對象,在對文件進行處理過程都需要使用到這個函數,如果該文件無法被打開,會拋出 OSError。
注意:使用 open() 方法一定要保證關閉文件對象,即調用 close() 方法。
open() 函數常用形式是接收兩個參數:文件名(file)和模式(mode)。
完整的語法格式為:
open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
⑧ Python語言命令行參數解析接收參數執行腳本的三種方法
在Windows系統上,Python腳本文件當然雙擊就能直接運行。不過我們往往需要在執行腳本的時候還要添加相應的參數,另外在Ubuntu系統中,我們執行文件往往和其他系統或用戶命令一樣,需要在終端中輸入,參數當然也要一並加上。所以機智客這里說的意思是,執行Python腳本(.py文件)時候需要輸入相應參數,這樣程序怎麼寫的方法。
上面這么說可能有點不明不白的,或者有朋友會用但未必知道命令行解析這種表達方式。舉個例子,比如我們在執行一個腳本文件的時候,可能會在CMD或者終端中輸入python demo.py 10或者python demo.py --separator 10後面這個數字就是參數。我們要編寫這樣的腳本或者函數,有哪些方法呢?這里列舉三種常用的。
一個是用系統模塊sys。引入模塊語句是import sys。也就是Python語言的內置庫中的sys.argv。argv通常有argv[0],argv[1],argv[2]這樣幾個參數。基本使用方法是m_sil_len = int(sys.argv[1])傳入第一個參數,sil_th = int(sys.argv[2])傳入第二個參數。如果是簡單一點的參數或者腳本,我們引入了sys。可以直接用這個傳入參數。
一種是用模塊argparse來實現,這是標准庫中推薦的命令行解析模塊。引入模塊語句是import argparse。基本使用方法是引入模塊後,先parser = argparse.ArgumentParser()創建對象,然後調用方法添加參數parser.add_argument("jzk", help="這是關於參數的說明", type=int),之後args = parser.parse_args()使用解析就可以用了。機智客看到這個方法在很多項目腳本中使用。我們在閱讀機器學習AI之類的開源項目,就會發現很多人用的都是這個方法。
還有一個就是用fire模塊,用於生成命令行界面的工具。引入模塊語言是import fire。它默認以-為參數分隔符的。基本使用方法是fire.Fire()。這個不僅可以做命令行的參數解析,還可以還給一個類class添加命令行。所以使用時候括弧里填入函數名或者類名即可,也就是裡面的參數可以是其他Python對象。
⑨ Python基礎之:Python中的IO
IO就是輸入和輸出,任何一個程序如果和外部希望有交互的話,都需要使用到IO。相對於java而言,Python中的IO更加的簡單,易用。
本文將會詳細介紹Python中的IO操作。
linux中有三種標准輸入輸出,分別是STDIN,STDOUT,
STDERR,對應的數字是0,1,2。
STDIN是標准輸入,默認從鍵盤讀取信息;
STDOUT是標准輸出,默認將輸出結果輸出至終端;
STDERR是標准錯誤,默認將輸出結果輸出至終端。
我們常用的 2>&1,指將標准輸出、標准錯誤指定為同一輸出路徑 。
python中,我們可以使用print方法來輸出信息。\
我們看下print函數的定義:
print函數將 objects 列印到 file 指定的文本流,以 sep 分隔並在末尾加上 end。 sep, end, file 和 flush 如果存在,那麼必須以關鍵字參數的形式給出。
所有非關鍵字參數都會被轉換為字元串,並會被寫入到流,以 sep 分割,並在末尾加上 end。 sep 和 end 都必須為字元串;它們也可以為 None,這意味著使用默認值。 如果沒有給出 objects,則 print() 將只寫入 end。
file 參數必須是一個具有 write(string) 方法的對象;如果參數不存在或為 None,則將使用 sys.stdout。 由於要列印的參數會被轉換為文本字元串,因此 print()不能用於二進制模式的文件對象。 對於這些對象,可以使用 file.write(...)。
輸出是否被緩存通常決定於 file,但如果 flush 關鍵字參數為真值,輸出流會被強制刷新。
可以看到print的輸出格式還是比較簡單的。我們接下來看一下怎麼豐富輸出的格式。
如果想要格式化字元串,可以在字元串的開始引號之前加上 f 或 F。
這樣的話,我們可以直接在字元串中引入變數值,只需要把變數放在 { 和 } 中間即可。
除了在{ }中放入Python變數之外,還可以在其中放入函數:
在 ':' 後傳遞一個整數可以讓該欄位成為最小字元寬度。方便列對齊:
{ }中的變數後面還可以跟著轉值符號:'!a' 表示應用 ascii() ,'!s' 表示應用 str(),還有 '!r' 表示應用 repr():
除此之外,str本身自帶一個功能強大的format 函數:
調用此方法的字元串可以包含字元串字面值或者以花括弧 {} 括起來的替換域,每個替換域可以包含一個位置參數的數字索引,或者一個關鍵字參數的名稱。 返回的字元串副本中每個替換域都會被替換為對應參數的字元串值。
再看一個使用索引的例子:
看一個關鍵字的例子:
再看一個組合的例子:
還有非常復雜的組合的例子:
或者使用 '**' 符號將 table 作為關鍵字參數傳遞:
還可以使用n類型 '{:n}' 來格式化數字:
如果我們只是想要將Python對象轉換為字元串,那麼可以使用repr()或者str(), str() 函數是用於返回人類可讀的值的表示,而 repr()是用於生成解釋器可讀的表示。
舉個例子:
str對象還提供了一些對字元串進行手動格式化的方法:
字元串對象的 str.rjust()方法通過在左側填充空格來對給定寬度的欄位中的字元串進行右對齊。類似的方法還有 str.ljust()和 str.center()。
如果輸入的字元串太長,它們不會截斷字元串,而是原樣返回。
如果想保證字元串的長度,則可以使用切片: x.ljust(n)[:n] 。
還可以使用str.zfill()來用0填充字元串:
% 也可以用來格式化字元串,給定 'string' % values,則 string 中的 % 實例會以零個或多個 values 元素替換。 此操作通常被稱為字元串插值。
python中文件讀取非常簡單,使用open()方法即可。
open()會返回一個文件對象。我們看一下它的定義:
第一個參數是文件名。
第二個參數是文件打開的模式,可用的模式有:
默認模式為 'r' 。
看一個open文件的例子:
文件打開了,自然需要被關閉,所以我們需要顯示調用 f.close() 方法:
有沒有類似java中的try with resource的自動關閉文件的功能呢?
我們可以使用with,這樣文件在使用完畢之後,會自動被關閉,非常的好用。
文件被關閉之後,如果想要再次讀取,就會報錯:
獲取到文件對象之後,我們就可以調用文件中的方法了。
f.read(size) 會讀取一些數據並將其作為字元串(在文本模式下)或位元組串對象(在二進制模式下)返回。
size 是一個可選的數值參數。 當 size 被省略或者為負數時,將讀取並返回整個文件的內容;當取其他值時,將讀取並返回至多 size 個字元(在文本模式下)或 size 個位元組(在二進制模式下)。 如果已到達文件末尾,f.read() 將返回一個空字元串 ('')。
f.readline() 從文件中讀取一行;換行符(\n)留在字元串的末尾,如果文件不以換行符結尾,則在文件的最後一行省略。如果 f.readline() 返回一個空的字元串,則表示已經到達了文件末尾,而空行使用 '\n' 表示,該字元串只包含一個換行符。
還有一種更加簡單的讀取方法,就是從文件中遍歷:
如果你想以列表的形式讀取文件中的所有行,你也可以使用 list(f) 或 f.readlines()。
f.write(string) 會把 string 的內容寫入到文件中,並返回寫入的字元數。
如果是在文本模式下,那麼在寫入文件之前,需要把對象轉換成為文本形式,我們可以使用str()來進行轉換。
使用f.seek(offset, whence)可以定位文件指針的位置,然後後續會從該位置開始進行讀取操作。
whence 的 0 值表示從文件開頭起算,1 表示使用當前文件位置,2 表示使用文件末尾作為參考點。 whence 如果省略則默認值為 0,即使用文件開頭作為參考點。
JSON是一個很方便進行信息交流的文件格式。我們看下怎麼使用JSON來將對象轉換為字元串:
mps是將對象轉換為json str。 json還有一個mp方法,可以直接將對象存入到文件中。
要從文件中解析出json字元串,可以使用load:
JSON 中的鍵-值對中的鍵永遠是 str類型的。當一個對象被轉化為 JSON 時,字典中所有的鍵都會被強制轉換為字元串。這所造成的結果是字典被轉換為 JSON 然後轉換回字典時可能和原來的不相等。換句話說,如果 x 具有非字元串的鍵,則有 loads(mps(x)) != x。