看到了別人寫的一篇有關"框架"的文章,看完覺得寫得很好,怕忘記所以在這邊記一些重
點。
會有框架的出現在於"為了解決在軟體開發過程中重複的流程"。
每個框架的實作必然支持某個架構與流程,這是框架要解決本質性的ˊ問題,但由於框架作為
一種工具,本身必然也會帶來也些附屬的問題。所以在使用框架必先辨識框架要解決的流程
本質,並對即將被導入框架的系統有通盤瞭解,方可評估採用後的價值,是否超越隨著框架
附屬而來的繁複設定。
Brooks書中亦談到:「軟體建構中本質的部份,指的是概念的智能創作,而附屬的部份,指
的是實作程序。」在開發軟體的過程中,有時會發現解決軟體中某些問題時,創造出的方法
概念具有某種程度的相似性或交集,若對類似概念重複進行實作,重複耗費的附屬性成本著
實是種浪費,因而在實作類似概念時考量了彈性與通用性,使得後續軟體開發中出現類似的
智能創作時,可以直接套用先前既有成品,避免一再重複的實作程序,而這個既有的成品就
是框架。
避免框架附屬困難模糊應用焦點
有些框架一開始會有組態不便或設定複雜的問題,然而,這些附屬的困難度,可隨著輔助工
具的推出、框架的改版、新的組態媒介,而降低甚至消失。
過於將學習或使用重點放在框架的附屬性困難上,會對理解框架本質造成阻礙,只是學會那
些將來可能不再適用的API組裝並不值得炫耀,也不應自認為懂得如何完成複雜組態設定而洋
洋自得,畢竟那並非框架存在的真正意義。
參考的文章來自於
http://www.ithome.com.tw/node/77201
2014年9月30日 星期二
FileZilla過濾器
當要從server上下載code時,發現裡面很多資料夾都有.svn,版本控管的東西,所以當不想把這些東西也從server上抓下來時,就可以使用FileZilla的過濾器,過濾掉這些東西,只抓需要的code。
點選檔名篩選器
勾選遠端篩選器的CVS and SVN directories,再點選編輯篩選規則
接著點選左邊的CVS and SVN directories,然後再把檔案目錄都打勾,並可以透過新增更多項目及移除所選項目去設定要過濾的規則。
接著按確認,下載code時就可以避掉.svn的東西了。
Linux常用指令
ps 指令
ps aux
觀察系統所有的程序資料
ps -l
僅列出與你的操作環境 (bash) 有關的程序而已
ps -A
ps-e
所有的process均顯示出來
ps -f
顯示更完整的process輸出
finde 指令
find /var/log -iname '*.log' -type f
指定只要搜尋「檔案」名稱
find /etc -iname 'apache2' -type d
指定只要搜尋「目錄」名稱
ps aux
觀察系統所有的程序資料
ps -l
僅列出與你的操作環境 (bash) 有關的程序而已
ps -A
ps-e
所有的process均顯示出來
ps -f
顯示更完整的process輸出
finde 指令
find /var/log -iname '*.log' -type f
指定只要搜尋「檔案」名稱
find /etc -iname 'apache2' -type d
指定只要搜尋「目錄」名稱
2014年9月18日 星期四
SQL create table
postgresql:
建立table:
CREATE TABLE PUB_CARRIER
(
PUBLIC_CARRIER_ID NUMERIC NOT NULL,
CREATE_DATE DATE DEFAULT 'now',
TRANSACTION_ID VARCHAR(18) NOT NULL ,
CARRIER_ID1 VARCHAR(64),
SEQ NUMERIC(10,0) DEFAULT 0 ,
EMAIL VARCHAR(100),
PRINTMARK NUMERIC(2,0) DEFAULT 0 ,
PRINT_DATATIME DATE,
PUBLIC_CARRIER_STATUS VARCHAR(10) DEFAULT '00' ,
EMAIL_INV VARCHAR(1),
EMAIL_NOWIN VARCHAR(1)
)
建立primary key:
ALTER TABLE AWARD_INVOICE ADD PRIMARY KEY (SERIAL_NUMBER);
建立table:
CREATE TABLE PUB_CARRIER
(
PUBLIC_CARRIER_ID NUMERIC NOT NULL,
CREATE_DATE DATE DEFAULT 'now',
TRANSACTION_ID VARCHAR(18) NOT NULL ,
CARRIER_ID1 VARCHAR(64),
SEQ NUMERIC(10,0) DEFAULT 0 ,
EMAIL VARCHAR(100),
PRINTMARK NUMERIC(2,0) DEFAULT 0 ,
PRINT_DATATIME DATE,
PUBLIC_CARRIER_STATUS VARCHAR(10) DEFAULT '00' ,
EMAIL_INV VARCHAR(1),
EMAIL_NOWIN VARCHAR(1)
)
建立primary key:
ALTER TABLE AWARD_INVOICE ADD PRIMARY KEY (SERIAL_NUMBER);
取得當月最後一天
JAVA:
public static void main(String[] args) {
SimpleDateFormat sdf = new SimpleDateFormat("dd");
Calendar calendar = Calendar.getInstance();
System.out.println("today="+sdf.format(calendar.getTime()));
calendar.add(Calendar.MONTH,1); //Calendar.MONTH 加上1個月(用add Method)
System.out.println("nextMonthDay="+sdf.format(calendar.getTime()));
//第一天
System.out.println("nextMonthFrist="+sdf.format(getFirstMonthDay(calendar)));
//最後一天
System.out.println("nextMonthLast="+sdf.format(getLastMonthDay(calendar)));
}
//每個月的第一天日期
public static Date getFirstMonthDay(Calendar calendar) {
calendar.set(Calendar.DATE, calendar.getActualMinimum(Calendar.DATE));
return calendar.getTime();
}
//每個月的最後一天日期
public static Date getLastMonthDay(Calendar calendar) {
calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
return calendar.getTime();
}
Javascript:
Date.prototype.Format = function (fmt) {
var o = {
"M+": this.getMonth() + 1,
"d+": this.getDate(),
"h+": this.getHours(),
"m+": this.getMinutes(),
"s+": this.getSeconds(),
"q+": Math.floor((this.getMonth() + 3) / 3),
"S": this.getMilliseconds()
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}
function showWeekFirstDay()
{
var Nowdate=new Date();
var WeekFirstDay=new Date(Nowdate-(Nowdate.getDay()-1)*86400000);
alert(WeekFirstDay.Format("yyyy-MM-dd"))
}
function showWeekLastDay()
{
var Nowdate=new Date();
var WeekFirstDay=new Date(Nowdate-(Nowdate.getDay()-1)*86400000);
var WeekLastDay=new Date((WeekFirstDay/1000+6*86400)*1000);
alert(WeekLastDay.Format("yyyy-MM-dd"))
}
function showMonthFirstDay()
{
var Nowdate=new Date();
var MonthFirstDay=new Date(Nowdate.getYear(),Nowdate.getMonth(),1);
alert(MonthFirstDay.Format("yyyy-MM-dd"))
}
function showMonthLastDay()
{
var Nowdate=new Date();
var MonthNextFirstDay=new Date(Nowdate.getYear(),Nowdate.getMonth()+1,1);
var MonthLastDay=new Date(MonthNextFirstDay-86400000);
alert(MonthLastDay.Format("yyyy-MM-dd"))
}
Oracle sql:
select extract(day from last_day(sysdate)) from dual;
SELECT a.HSN_CD,
a.ITEM_CD,
A.Item_Nm,
DECODE(a.ITEM_VAL,'*', to_char(extract(day from last_day(sysdate))) , A.Item_Val) ITEM_VAL,
A.Item_Cntnt ,
NVL(B.Hsn_Nm, '共通') Hsn_Nm
FROM TABLENAMEA a
LEFT JOIN TABLENAMEB b
On A.Hsn_Cd = B.Hsn_Cd
Where A.Hsn_Cd = 'A';
2014年9月16日 星期二
apache Velocity 練習
練習專案的架構:
VelocityBaseTest.java:
package com.demo.test;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
public class VelocityBaseTest {
public static void main(String[] args) {
try {
//也可使用properites設定,這邊練習不需要
//Velocity.init("properties/velocity.properties");
// 取得velocity上下文
VelocityContext context = new VelocityContext();
context.put("name", "Daniel");
Template template = Velocity.getTemplate("template/hello.vm");
StringWriter writer = new StringWriter();
template.merge(context, writer);
PrintWriter filewriter = new PrintWriter(new FileOutputStream(
"outputTemplate/hello.html"), true);
filewriter.println(writer.toString());
filewriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
hello.vm:
<html>
<head></head>
<body>
HELLO! $name,Welcome to velocity!
</body>
</html>
Velocity.properties:
#Velocity.properties配置示例
# 如果需要系統從WEB-INF/classes路徑載入Velocity的範本檔,取消下兩行的注釋
#resource.loader=class
#class.resource.loader.class=org.apache.Velocity.runtime.resource.loader.ClasspathResourceLoader
#如需禁止系統通過檔案系統載入範本檔,注釋如下兩行
resource.loader=file
file.resource.loader.path=D:\practice\VJ\workspace\velocitytest\template
#確定從何處載入velocity的範本檔
file.resource.loader.cache=false
input.encoding=gb2312
output.encoding=gb2312
產出的檔案:
hello.html:
<html>
<head></head>
<body>
HELLO! sea,Welcome to velocity!
</body>
</html>
VelocityBaseTest.java:
package com.demo.test;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.io.StringWriter;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;
public class VelocityBaseTest {
public static void main(String[] args) {
try {
//也可使用properites設定,這邊練習不需要
//Velocity.init("properties/velocity.properties");
// 取得velocity上下文
VelocityContext context = new VelocityContext();
context.put("name", "Daniel");
Template template = Velocity.getTemplate("template/hello.vm");
StringWriter writer = new StringWriter();
template.merge(context, writer);
PrintWriter filewriter = new PrintWriter(new FileOutputStream(
"outputTemplate/hello.html"), true);
filewriter.println(writer.toString());
filewriter.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
hello.vm:
<html>
<head></head>
<body>
HELLO! $name,Welcome to velocity!
</body>
</html>
Velocity.properties:
#Velocity.properties配置示例
# 如果需要系統從WEB-INF/classes路徑載入Velocity的範本檔,取消下兩行的注釋
#resource.loader=class
#class.resource.loader.class=org.apache.Velocity.runtime.resource.loader.ClasspathResourceLoader
#如需禁止系統通過檔案系統載入範本檔,注釋如下兩行
resource.loader=file
file.resource.loader.path=D:\practice\VJ\workspace\velocitytest\template
#確定從何處載入velocity的範本檔
file.resource.loader.cache=false
input.encoding=gb2312
output.encoding=gb2312
產出的檔案:
hello.html:
<html>
<head></head>
<body>
HELLO! sea,Welcome to velocity!
</body>
</html>
2014年9月13日 星期六
JAVA Process簡單應用
*java如果要執行exe或bat可執行檔,可以利用 Runtime.getRuntime().exec("xxx.exe")來執行,如下就可以啟動jmeter。
Process process = Runtime.getRuntime().exec("D:/JMeter/apache-jmeter-2.9/bin/jmeter.bat");
*可利用下面語法看到目前作業系統
System.out.println(System.getProperty("os.name"));
練習使用JAVA 在目前正在執行 process 裡找到特定的process,並找到pid kill掉。
範例:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class ExcuteTest {
public static void main(String[] args) {
try {
Process process = Runtime.getRuntime().exec("tasklist");
int taskId = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream(), "MS950"));
String line = null;
while ((line = br.readLine()) != null) {
if (line.indexOf("Skype.exe") != -1) {
line = line.substring( "Skype.exe".length() );
System.out.println(line.trim());
taskId = Integer.parseInt( (line.trim().split( " " ))[0] );
System.out.println( "Task Id: " + taskId );
}
}
Runtime rt = Runtime.getRuntime();
if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) {
System.out.println("taskkill......." + taskId);
rt.exec("tskill " + taskId);
} else {
System.out.println("kill -9 ......." + taskId);
rt.exec("kill -9 " + taskId);
}
} catch (IOException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
}
繼承練習-形狀(圓形繼承橢圓、橢圓繼承圓形、都不繼承或著...)
Shape.java:
public interface Shape {
public double area();
public void display();
}
RoundShape.java:
public class RoundShape implements Shape {
private int radius1;
private int radius2;
public RoundShape(int radius1,int radius2) {
this.radius1 = radius1;
this.radius2 = radius2;
}
@Override
public double area() {
return radius1 * radius2 * 3.14;
}
@Override
public void display() {
System.out.println("draw and display...");
}
}
Circle.java:
public class Circle extends RoundShape {
public Circle(int radius) {
super(radius, radius);
}
}
Ellipse.java:
public class Ellipse extends RoundShape {
public Ellipse(int radius1, int radius2) {
super(radius1, radius2);
}
}
UserTest.java:
public class UserTest {
public static void main(String[] args) {
Circle circle = new Circle(10);
System.out.println(circle.area());
Ellipse ellipse = new Ellipse(5,10);
System.out.println(ellipse.area());
}
}
2014年9月11日 星期四
安裝JDK8後 ireport 無法啟動
裝JDK8時裝好時,至cmd下java -version會發現原來的jdk版本設定會變成jdk8。
將此段拿掉就可以恢復原來JDK的設定了。
安裝完JDK8時,悲劇發生了ireport(版本4.7.0)啟動不起來了,找了一下資料後,發現ireport好像還不支援JDK8,所以網路的解法是去修改ireport的設定檔,我本機的路徑是在
"E:\ireport\iReport-4.7.0\etc"底下有個ireport.conf。在設定檔新加一段 jdkhome="C:/Program Files/Java/jdk1.7.0_60",設定好之後ireport就可以正常啟動了。將從svn check out的程式裡的.svn資料夾刪除
從svn取下的程式會有.svn這資料夾,放的是一些svn上的版本資訊,但如果不需要這些.svn這些資料夾時,一個一個刪太多了,又浪費時間,所以可利用下面範例將目錄下的.svn資料夾都刪除。
範例:
package com.prc.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class DelDirTest {
private static String dirPath = "E:/fileTest";
private static String[] delDirName = { ".svn" };
/**
* @param args
*/
public static void main(String[] args) {
try {
List<File> fileList = new ArrayList<File>();
visitedDirectory(dirPath, fileList);
//列出資料夾裡的檔案及資訊
for (File file : fileList) {
System.out.println(file.getName() + " " + new FileInputStream(file).available());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void visitedDirectory(String path, List<File> fileList) {
File file = new File(path);
File[] subFile = file.listFiles();
for (int i = 0; i < subFile.length; i++) {
if (subFile[i].isDirectory()) {
if (delDirName[0].equals(subFile[i].getName())) {
deleteDirectory(subFile[i]);
} else {
visitedDirectory(subFile[i].getAbsolutePath(), fileList);
}
} else {
fileList.add(subFile[i]);
}
}
}
public static boolean deleteDirectory(File directory) {
if (!directory.exists() || !directory.isDirectory()) {
return false;
}
String[] files = directory.list();
for (int i = 0, len = files.length; i < len; i++) {
File f = new File(directory, files[i]);
if (f.isDirectory()) {
deleteDirectory(f);
} else {
f.delete();
}
}
return directory.delete();
}
}
範例:
package com.prc.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class DelDirTest {
private static String dirPath = "E:/fileTest";
private static String[] delDirName = { ".svn" };
/**
* @param args
*/
public static void main(String[] args) {
try {
List<File> fileList = new ArrayList<File>();
visitedDirectory(dirPath, fileList);
//列出資料夾裡的檔案及資訊
for (File file : fileList) {
System.out.println(file.getName() + " " + new FileInputStream(file).available());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void visitedDirectory(String path, List<File> fileList) {
File file = new File(path);
File[] subFile = file.listFiles();
for (int i = 0; i < subFile.length; i++) {
if (subFile[i].isDirectory()) {
if (delDirName[0].equals(subFile[i].getName())) {
deleteDirectory(subFile[i]);
} else {
visitedDirectory(subFile[i].getAbsolutePath(), fileList);
}
} else {
fileList.add(subFile[i]);
}
}
}
public static boolean deleteDirectory(File directory) {
if (!directory.exists() || !directory.isDirectory()) {
return false;
}
String[] files = directory.list();
for (int i = 0, len = files.length; i < len; i++) {
File f = new File(directory, files[i]);
if (f.isDirectory()) {
deleteDirectory(f);
} else {
f.delete();
}
}
return directory.delete();
}
}
grep 多台 server logs
當要同時grep多台server的log時,可寫一隻shell幫忙去grep每台server的log出來,集中到一個檔案上做查詢。
範例:
grepPKIOSK.sh
echo $1
grep --color=auto $1 -n -A50 -B50 /NODUPFILE_1/AP05/PKIOSK/logs/nohup.out /NODUPFILE_1/AP07/PKIOSK/logs/nohup.out /NODUPFILE_1/AP09/PKIOSK/logs/nohup.out /NODUPFILE_2/AP06/PKIOSK/logs/nohup.out /NODUPFILE_2/AP08/PKIOSK/logs/nohup.out /NODUPFILE_2/AP10/PKIOSK/logs/nohup.out
$1:給的參數
-A50 (After 50 查到關鍵字的後50行)
-B50(Before 50 查到關鍵字的前50行)
執行
./grepPKIOSK.sh '2014-08-04' > kiosk20140804.log
將某一天的log查出來放置到kiosk20140804.log裡。
範例:
grepPKIOSK.sh
echo $1
grep --color=auto $1 -n -A50 -B50 /NODUPFILE_1/AP05/PKIOSK/logs/nohup.out /NODUPFILE_1/AP07/PKIOSK/logs/nohup.out /NODUPFILE_1/AP09/PKIOSK/logs/nohup.out /NODUPFILE_2/AP06/PKIOSK/logs/nohup.out /NODUPFILE_2/AP08/PKIOSK/logs/nohup.out /NODUPFILE_2/AP10/PKIOSK/logs/nohup.out
$1:給的參數
-A50 (After 50 查到關鍵字的後50行)
-B50(Before 50 查到關鍵字的前50行)
執行
./grepPKIOSK.sh '2014-08-04' > kiosk20140804.log
將某一天的log查出來放置到kiosk20140804.log裡。
2014年9月8日 星期一
CSS margin 外邊距合併
範例1:
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="UTF-8">
<style>
#div001 {
background-color:#FF0000;
border:1px solid;
width:100px;
height:100px;
margin:100px;
}
#div002 {
background-color:#00FF00;
border:1px solid;
width:100px;
height:100px;
margin:100px;
}
#divContent {
border:1px solid;
width:300px;
height:500px;
}
</style>
</head>
<body>
<div id="divContent">
<div id="div001">this is Div Contents</div>
<div id="div002">this id Div Contents</div>
</div>
</body>
</html>
此兩個div區塊margin屬性都設為100px,加起來應該是200px,但實際上還是只有100px。
因為瀏覽器實作了外邊距合併的功能:
上下兩個相鄰的矩形之間的外邊距會合併,合併後的外邊距會以外邊距較大的數值來做為外邊距設定的值。
範例2:
<!DOCTYPE html>
<html>
<head>
<title></title>
<meta charset="UTF-8">
<style>
#div001 {
background-color:#FF0000;
border:1px solid;
width:100px;
height:100px;
margin:100px;
}
#div002 {
background-color:#00FF00;
border:1px solid;
width:100px;
height:100px;
margin:100px;
}
#divContent {
border:1px solid;
width:300px;
height:500px;
}
</style>
</head>
<body>
<div id="divContent">
<div id="div001">this is Div Contents</div>
<div id="div002">this id Div Contents</div>
</div>
</body>
</html>
因為瀏覽器實作了外邊距合併的功能:
上下兩個相鄰的矩形之間的外邊距會合併,合併後的外邊距會以外邊距較大的數值來做為外邊距設定的值。
範例2:
#div001 {
background-color:#FF0000;
border:1px solid;
width:100px;
height:100px;
margin:200px;
}
#div002 {
background-color:#00FF00;
border:1px solid;
width:100px;
height:100px;
margin:100px;
}
#divContent {
border:1px solid;
width:500px;
height:500px;
}
<div id="divContent">
<div id="div001">this is Div Contents</div>
<div id="div002">this id Div Contents</div>
</div>
2014年9月3日 星期三
jquery div a 與 div > a 的差異
div a : 取得div內部的所有的超連結
div > a : 取得div父元素其下的超連結
範例:
<div id="div1">
<a id="a1">a1</a>
<a id="a2">a2</a>
<div id="div11">
<a id="a11">a11</a>
</div>
</div>
<div id="div2">
<span id="s1">
<a id="b1">b1</a>
<a id="b2">b2</a>
</span>
</div>
$('div a').css('color','red');
$('div > a').css('color','red');
div id="div2"底下的子元素只有span,所以span底下的超連結就不會被選到
div > a : 取得div父元素其下的超連結
範例:
<div id="div1">
<a id="a1">a1</a>
<a id="a2">a2</a>
<div id="div11">
<a id="a11">a11</a>
</div>
</div>
<div id="div2">
<span id="s1">
<a id="b1">b1</a>
<a id="b2">b2</a>
</span>
</div>
$('div a').css('color','red');
$('div > a').css('color','red');
div id="div2"底下的子元素只有span,所以span底下的超連結就不會被選到
jquery 密碼欄位是否顯示密碼
由於type屬性不能修改所以無法使用:
$('#ban').prop('type','text')
解決辦法:
1.先建立一個新的input 欄位加在原來input位置
2.把原來的值複製過去
3.把原來的input移除
範例:
javascript:
function showPassWord() {
if($('#checkPassWord').prop('checked')) {
$('<input type="text" id="ban"/>').val($('#ban').val()).insertAfter('#ban').prev().remove();
} else {
$('<input type="password" id="ban"/>').val($('#ban').val()).insertAfter('#ban').prev().remove();
}
}
html:
password:<input type="password" id="ban" />
<input type="checkbox" id="checkPassWord" onclick="showPassWord()">是否顯示密碼
2014年9月2日 星期二
Python 讀檔寫檔
Python讀檔與寫檔
使用open這function並給參數'r'或'w'
'r' -> 讀檔 readline()
'w' -> 寫檔 write()
以下為簡單的範例
fin = open('test.txt', 'r')
fout = open('E:/python/fileTest/fileTest.txt', 'w')
while True :
i = fin.readline()
fout.write(i)
if i=='': break
print(i,end='')
fin.close()
fout.close()
with讀檔
當使用with此函數,程式在離開with區塊後會自行關檔
with open("test.txt") as f:
for line in f:
print(line)
使用open這function並給參數'r'或'w'
'r' -> 讀檔 readline()
'w' -> 寫檔 write()
以下為簡單的範例
fin = open('test.txt', 'r')
fout = open('E:/python/fileTest/fileTest.txt', 'w')
while True :
i = fin.readline()
fout.write(i)
if i=='': break
print(i,end='')
fin.close()
fout.close()
with讀檔
當使用with此函數,程式在離開with區塊後會自行關檔
with open("test.txt") as f:
for line in f:
print(line)
訂閱:
文章 (Atom)