כן צודק- בקריאה שניה של התרגיל נראה לי שהכוונה בשילוב היא שאם הקובץ האחרון לא קיים יש ליצור אותו, או אם כל אחד מהקבצים האחרים לא קיים יש להציג שגיאה
פתרון תרגיל 1 בנושא קבצים
import sys
import os
path = "C:\\Python\\files_3\\"
path_w = path + sys.argv[len(sys.argv)-1]
for file in range(1,len(sys.argv)-1):
path_r = path + sys.argv[file]
if not os.path.isfile(path_r):
sys.exit("File doesn't exist")
with open(path_r,"r") as f_r:
with open(path_w,"a") as f_w:
for line in f_r:
f_w.write(line)
f_w.write("\n")
הי הי,
יש פיצ׳ר נחמד בפייתון שחוסך את ה \ הכפול במחרוזות באמצעות הוספת האות r לפני המחרוזת. במילים אחרות:
path = r"C:\Python\files_3\"
יעבוד לך טוב ויהיה יותר נעים לעין.
דבר נוסף לגבי הלולאה שלך אני הייתי כותב אותה קצת אחרת:
for file in [path + name for name in sys.argv[1:-1]:
# now file is already path_r
if not os.path.isfile(file):
sys.exit("...")
הי,
פתרון תרגיל 2 בנושא קבצים
import sys
import os
from itertools import izip_longest
path = "C:\\Python\\files_3\\"
if len(sys.argv) != 4: sys.exit("Usage: %s <file1.txt> <file2.txt> <file3.txt>" % sys.argv[0])
path_1 = path + sys.argv[1]
path_2 = path + sys.argv[2]
path_3 = path + sys.argv[3]
with open(path_1,"r") as file1, open(path_2,"r") as file2:
with open(path_3,"a") as file3:
for line1, line2 in izip_longest(file1, file2):
if line1 is not None:
if line1[-1] != "\n":line1 += "\n"
file3.write(line1)
if line2 is not None:
if line2[-1] != "\n":line2 += "\n"
file3.write(line2)
ניסיתי לכתוב כפי שהצעת: "\path = r"C:\Python\files_3
אך קיבלתי הודעת שגיאה
File "targil_2.py", line 5
path = r "C:\Python\files_3\"
^
SyntaxError: EOL while scanning string literal
אויש נכון זה לא עובד על ה \ האחרון…
עוד אפשרות זה להשתמש בלוכסן קדימה:
path = r'C:/Python/files_3/'
פתרון תרגיל 3 בנושא קבצים
import csv
import sys
numbers = 0
path = "C:\\Python\\files_3\\"
path_csv = path + sys.argv[1]
with open(path_csv,"rb") as file:
reader = csv.reader(file)
rows = [int(row[1]) for row in reader]
numbers = sum(rows)
print numbers
הי,
נסיתי את מה שעשית בסרטון פייתון ועברית אצלי במחשב - ללא הצלחה
כאשר ניסיתי להדפיס “שלום לכולם” זה מה שיצא:
וכשניסיתי לשמור זאת בקובץ זה מה שיצא:
מכיוון שלא הצלחתי לשמור (באמצעות הקוד ) את התוכנית בקובץ, לא ניסיתי את פעולת הקריאה מתוך קובץ.
לבסוף , כשנסיתי את התוכנית המבקשת קלט מהמשתמש - זה עבד אך כשהזנתי שם בעברית למסך קיבלתי אותו בסימני שאלה במקום בעברית…
תודה , עמיר
במחשב בעבודה (WIN 7) היא מדפיסה את זה
ובמחשב בבית (WIN 10) התוצאה היתה הדפסה אך במקום “שלום לכולם” היא הדפיסה סימני שאלה
הי,
להלן פתרון תרגיל 1 בנושא מבני נתונים. (אשמח להתייחסותך לתרגיל 3 בנושא קבצים ששלחתי לעיל (: )
User_pass_dic = {'apple':'red','lettuce':'green','lemon':'yellow','orange':'orange'}
user_pass_list = []
for i in ['Username','Password']:
user_pass_list.append(raw_input('enter %s: ' % i))
if user_pass_list[0] in User_pass_dic and User_pass_dic[user_pass_list[0]] == user_pass_list[1]:
print 'Welcome Master'
else:
print 'INTRUDER ALERT'
שבת שלום וסופ"ש נעים
לגבי מבני הנתונים אני חושב שאפשר לוותר על user_pass_list
. נסה למצוא דרך לפתור את התוכנית בלעדיו. לגבי קבצים אחלה פיתרון
ולגבי העברית אמשיך לבדוק נשמע שמשהו בהגדרות המסוף בווינדוס לא מדויק אחפש ואעדכן
תיקון (מבני נתונים)
User_pass_dic = {'apple':'red','lettuce':'green','lemon':'yellow','orange':'orange'}
username = raw_input('Enter Username: ')
password = raw_input('Enter Password: ')
if username in User_pass_dic and User_pass_dic[username] == password:
print 'Welcome Master'
else:
print 'INTRUDER ALERT'
עכשיו בוא נדבר שניה על שמות משתנים. אותה תוכנית עם שמות אחרים:
saved_password = {'apple':'red','lettuce':'green','lemon':'yellow','orange':'orange'}
valid_users = saved_password.keys()
username = raw_input('Enter Username: ')
password_from_user = raw_input('Enter Password: ')
if username in valid_users and password_from_user == saved_password[username]
print 'Welcome Master'
else:
print 'INTRUDER ALERT'
שינויים קטנים מסוג זה מאוד עוזרים להבין למה התכוונת כשמסתכלים על התוכנית בעוד כמה שבועות
פתרון תרגיל 2 (מבני נתונים)
import sys
average = 0
sum = 0
for i in sys.argv[1:]:
sum += int(i)
average = sum / len(sys.argv[1:])
for i in sys.argv[1:]:
if int(i) > average:
print i,
פתרון תרגיל 3 (מבני נתונים)
import sys
pc_id ={}
with open ('C:\\Python\\data_4\\pc_id.txt','r') as file:
for line in file:
k,v = line.split('=')
pc_id[k] = v
for item in sys.argv[1:]:
if item in pc_id:
print pc_id[item]
else:
print 'your PC: {} is not in the list'.format(item)
הי,
כמה הערות:
-
לא נהוג לקרוא למשתנה בשם
sum
מאחר ויש כבר פונקציה בשפה בשם זה. -
כדאי לשמור את הערכים אחרי ההמרה ל int ברשימה חדשה, ואז לא תצטרך להמיר אותם ל int פעם שניה בלולאה השניה.
-
תרגיל 3 - מעולה!
פתרון תרגיל 4 (מבני נתונים)
from collections import Counter
import sys
ref = {}
words_list =[]
to_print = []
path = sys.argv[1]
with open(path,'r') as anagram:
for line in anagram:
words_list.append(line.strip())
for index,word in enumerate(words_list):
for element in words_list[index+1:]:
if len(element) == len(word):
e = Counter(element)
w = Counter(word)
for k,v in e.items():
if k in w.keys() and w[k] == v:
ref[k] = w[k]
if ref == w:
to_print.append('{} {}'.format(element,word))
ref = {}
elif word not in to_print:
to_print.append(word)
for i in to_print:
print i
קצת מסורבל… אולי אפשר לסדר את הקוד בפונקציות שיהיה יותר קל לקרוא?
עוד לא הגענו לפונקציות…